我寫了一個簡單的過程。我嘗試將選擇結果存儲在變量中。我使用「SELECT INTO」查詢,但我無法做到這一點。如何將選擇結果存儲到Oracle過程中的變量中
例子:
DECLARE
v_employeeRecord employee%ROWTYPE;
BEGIN
SELECT * INTO v_employeeRecord
FROM Employee WHERE Salary > 10;
END;
我寫了一個簡單的過程。我嘗試將選擇結果存儲在變量中。我使用「SELECT INTO」查詢,但我無法做到這一點。如何將選擇結果存儲到Oracle過程中的變量中
例子:
DECLARE
v_employeeRecord employee%ROWTYPE;
BEGIN
SELECT * INTO v_employeeRecord
FROM Employee WHERE Salary > 10;
END;
你有幾個選項。你可以把該查詢到光標:
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;
我還沒有試過在甲骨文這些樣品,所以你可能會得到編譯器錯誤..
光標解決我的問題。 – 2009-08-28 14:18:47
你必須使用「BULK COLLECT INTO」 – jva 2009-08-28 15:27:40
@jva:謝謝你的收穫! – 2009-08-28 15:37:13
如果您的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;
很好的例子,謝謝 – 2009-08-28 14:20:51
您能否向我們提供一個簡單的示例和您收到的消息錯誤? – 2009-08-28 13:51:56
我只能存儲一行,但我的選擇結果包含很多行。 – 2009-08-28 14:00:13