2009-08-28 31 views
7

Tôi viết một quy trình đơn giản. Tôi cố gắng lưu trữ kết quả lựa chọn trong biến. Tôi sử dụng truy vấn "SELECT INTO" nhưng tôi không thể làm điều này.Cách lưu trữ kết quả lựa chọn theo biến trong quy trình Oracle

Ví dụ:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

Bạn có thể cung cấp cho chúng tôi một ví dụ đơn giản và thông báo lỗi bạn nhận được không? –

+0

Tôi chỉ có thể lưu trữ một hàng, nhưng kết quả lựa chọn của tôi chứa rất nhiều hàng. –

Trả lời

11

Bạn có một vài lựa chọn. Bạn có thể biến truy vấn đó vào một con trỏ:

DECLARE 
    CURSOR v_employeeRecords IS 
      SELECT * FROM Employee WHERE Salary > 10; 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
    FOR v_employeeRecord IN v_employeeRecords LOOP 
      /* Do something with v_employeeRecord */ 
    END LOOP; 
END; 

Hoặc, bạn có thể tạo một biến TABLE:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
    v_employeeRecords IS TABLE OF employee%ROWTYPE; 
    i BINARY_INTEGER; 
BEGIN 
SELECT * BULK COLLECT INTO v_employeeRecords 
     FROM Employee WHERE Salary > 10; 

i := v_employeeRecords.FIRST; 
WHILE v_employeeRecords.EXISTS(i) LOOP 
    v_employeeRecord := v_employeeRecords(i); 
    /* Do something with v_employeeRecord */ 
    i := v_employeeRecords.NEXT(i); 
END; 
END; 

Tôi chưa thử các mẫu trong Oracle, vì vậy bạn có thể nhận được lỗi biên dịch ..

+0

Con trỏ giải quyết vấn đề của tôi. –

+2

Bạn phải sử dụng "BULK COLLECT INTO" – jva

+0

@jva: Cảm ơn bạn đã bắt! –

7

NẾU SELECT của bạn trả về nhiều hàng, bạn sẽ không thể sử dụng tổ hợp SELECT INTO synthax.

Bạn sẽ cần phải xây dựng một vòng lặp để điều hướng thông qua các thiết lập resulte:

Adam chứng minh làm thế nào bạn sẽ sử dụng một con trỏ rõ ràng và một số lượng lớn thu thập vòng lặp. Tôi sẽ chỉ cách bạn có thể xây dựng vòng lặp đơn giản nhất có thể (con trỏ tiềm ẩn, không cần phần DECLARE):

BEGIN 
    FOR c_emp IN (SELECT * 
        FROM Employee 
        WHERE Salary > 10) LOOP 
     /* do something with each row, for example:*/ 
     UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id; 
    END LOOP; 
END; 
+0

Ví dụ tốt, cảm ơn –