簡體   English   中英

在Oracle過程中聲明表變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM