在Oracle过程中声明表变量

时间:2015-09-22 01:43:32

标签: oracle

我有一段时间试图找到这样做的例子。我有一个过程,作为该过程的一部分,我想存储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块,但我只是得到了另一个错误。

此声明应该在哪里?或者,如果有更好的解决方案,我也会采取这种方式!

2 个答案:

答案 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;

在我看来,唯一的缺点就是你有另一张表,临时表不是动态的。