[英]Execute PROCEDURE on Oracle PL/SQL with DECLARE variable
[英]Declare Table Variable in Oracle Procedure
我想找一個例子來說明這一點。 我有一個過程,作為該過程的一部分,我想存儲SELECT語句的結果,以便可以對該集合進行操作,然后在完成所有操作時將其用作更新原始記錄的引用。
我遇到的困難是聲明臨時表變量。 這是我要執行的操作的一個示例:
PROCEDURE my_procedure
IS
output_text clob;
temp_table IS TABLE OF MY_TABLE%ROWTYPE; -- Error on this line
BEGIN
SELECT * BULK COLLECT INTO temp_table FROM MY_TABLE WHERE SOME_DATE IS NULL;
-- Correlate results into the clob for sending to email (working)
-- Set the SOME_DATE value of the original record set where record is in temp_table
我在第二次出現IS
遇到錯誤,說這是一個意外的符號。 這向我表明我的表變量聲明是錯誤的,或在錯誤的位置。 我嘗試在BEGIN
之后將其放入DECLARE
塊中,但是我只是遇到另一個錯誤。
這個聲明應該去哪兒? 另外,如果有更好的解決方案,我也會考慮的!
CREATE OR REPLACE PROCEDURE PROCEDURE1 AS
output_text clob;
type temp_table_type IS TABLE OF MY_TABLE%ROWTYPE;
temp_table temp_table_type;
BEGIN
SELECT * BULK COLLECT INTO temp_table FROM MY_TABLE;
END PROCEDURE1;
要么
CREATE OR REPLACE PROCEDURE PROCEDURE1 ( output_text OUT clob ) IS
type temp_table_type IS TABLE OF MY_TABLE%ROWTYPE
INDEX BY BINARY_INTEGER;
temp_table temp_table_type;
BEGIN
SELECT * BULK COLLECT INTO temp_table FROM MY_TABLE;
FOR indx IN 1 .. temp_table.COUNT
LOOP
something := temp_table(indx).col_name;
END LOOP;
END PROCEDURE1;
我有一個類似的問題,發現了這個問題: 從Oracle表變量/數組中選擇值?
全局臨時表可以像常規表一樣使用,但是其內容只是臨時的(在會話/事務結束時刪除),每個會話都有自己的表內容。 如果您不需要動態SQL,則可以將其用作良好的解決方案:
CREATE GLOBAL TEMPORARY TABLE temp_table
(
column1 NUMBER,
column2 NUMBER
)
ON COMMIT DELETE ROWS;
PROCEDURE my_procedure
IS
output_text clob;
BEGIN
-- Clear temporary table for this session (to be sure)
DELETE FROM temp_table;
-- Insert data into temporary table (only for this session)
INSERT INTO temp_table SELECT * FROM MY_TABLE WHERE SOME_DATE IS NULL;
-- ...
END;
在我看來,唯一的缺點是您有另一個表並且臨時表不是動態的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.