我有一段时间试图找到这样做的例子。我有一个过程,作为该过程的一部分,我想存储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
时收到错误,说这是一个意外的符号。这告诉我,我的表变量声明是错误的,或者在错误的地方。我已经尝试在DECLARE
之后将其放入BEGIN
块,但我只是得到了另一个错误。
此声明应该在哪里?或者,如果有更好的解决方案,我也会采取这种方式!
答案 0 :(得分:4)
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;
答案 1 :(得分:0)
我有一个类似的问题并发现了这个: Selecting Values from Oracle Table Variable / Array?
全局临时表可以像常规表一样使用,但其内容只是临时的(在会话/事务结束时删除),每个会话都有自己的表内容。 如果您不需要动态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;
在我看来,唯一的缺点就是你有另一张表,临时表不是动态的。