2009-08-28 74 views
7

我寫了一個簡單的過程。我嘗試將選擇結果存儲在變量中。我使用「SELECT INTO」查詢,但我無法做到這一點。如何將選擇結果存儲到Oracle過程中的變量中

例子:

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

您能否向我們提供一個簡單的示例和您收到的消息錯誤? – 2009-08-28 13:51:56

+0

我只能存儲一行,但我的選擇結果包含很多行。 – 2009-08-28 14:00:13

回答

11

你有幾個選項。你可以把該查詢到光標:

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; 

或者,您可以創建一個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; 

我還沒有試過在甲骨文這些樣品,所以你可能會得到編譯器錯誤..

+0

光標解決我的問題。 – 2009-08-28 14:18:47

+2

你必須使用「BULK COLLECT INTO」 – jva 2009-08-28 15:27:40

+0

@jva:謝謝你的收穫! – 2009-08-28 15:37:13

7

如果您的SELECT返回多行,您將無法使用SELECT INTO synthax。

您將需要建立一個遍歷resulte集導航:

Adam演示瞭如何使用顯式遊標和散裝收集循環。我將向您展示如何構建最簡單的循環(隱式遊標,不需要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

很好的例子,謝謝 – 2009-08-28 14:20:51

相關問題