存储过程oracle 11g中的TEMP表

时间:2020-05-15 06:32:02

标签: sql oracle oracle11g

有什么方法可以使用存储过程创建临时表,并在同一存储过程的ref游标中使用它。 我写了类似下面的内容,它不起作用。...

    CREATE OR REPLACE PROCEDURE USP_TEST(
    CUR_QUOTE OUT SYS_REFCURSOR) AS 
    BEGIN
    CREATE GLOBAL TEMPORARY TABLE users1 ON COMMIT PRESERVE ROWS
    AS
      SELECT 'rb@bot.com' FROM DUAL;
      OPEN CUR_QUOTE FOR
      SELECT DISTINCT CREATEDBY
      FROM QUOTE
      WHERE TRUNC(DATEOFENQUIRY)=TRUNC(SYSDATE-1) AND CREATEDBY = users1.EMAIL;
    END;

并删除最后的临时表。 请提出一些示例代码... 继续编码:)

1 个答案:

答案 0 :(得分:1)

如果您放下表格,则光标无效。

从18c开始,您可以使用private temporary tables

create or replace procedure usp_test
    ( cur_quote out sys_refcursor )
as
begin
    execute immediate
        'create private temporary table ora$ptt_demo' ||chr(10)||
        'on commit drop definition as' ||chr(10)||
        'select sysdate -1 as dateofenquiry, ''rb@bot.com'' as createdby' ||chr(10)||
        'from   dual';

    open cur_quote for
        'select distinct createdby from ora$ptt_demo where trunc(dateofenquiry) = trunc(sysdate - 1)';
end;

请注意,表名必须具有PRIVATE_TEMP_TABLE_PREFIX参数定义的前缀(默认为ORA$PTT_),并且必须在再次调用该过程之前提交。