在Oracle中创建游标之前创建表

时间:2011-12-25 09:12:00

标签: oracle plsql oracle10g temp-tables

我有一个PL / SQL过程,它创建一个临时表,然后使用游标从该临时表中提取数据,处理数据然后删除临时表。但是,如果数据库中不存在该表,则Oracle不允许使用游标。

请帮我处理。

2 个答案:

答案 0 :(得分:8)

你的陈述不太正确。您可以将游标用于几乎任意的查询。见下文:

create or replace procedure fooproc
IS
    type acursor is ref cursor;
    mycur  acursor;
    mydate date;
BEGIN
    execute immediate 'create global temporary table footmp (bar date) on commit delete rows';
    execute immediate 'insert into footmp values (SYSDATE)';
    open mycur for 'select * from footmp';
    loop
        fetch mycur into mydate;
        exit when mycur%notfound;
        dbms_output.put_line(mydate);
    end loop;
    close mycur;
    execute immediate 'drop table footmp';
END fooproc;
/

(更多细节here - 特别是这个简短的过程根本不安全,因为表名是固定的而不是与会话相关的。)

它(非常)有点难看,而且我并不建议你使用它 - 相反,你应该考虑是否需要特定于程序的临时表。

请参阅this other article

  

请勿动态创建它们[临时表],请勿动态创建它们,请不要动态创建它们。

你不能使用全局临时表吗?你真的需要临时桌吗? (即,您在用于填充该表工作的select语句中没有使用游标?)

答案 1 :(得分:1)

或者,如果您希望避免全局临时表与“常规”永久表之间的差异,您可能会习惯(请参阅Oracle docs关于临时表数据可用性,生命周期等),只需先创建表(nologging) )。假设没有其他人使用此表,您的程序可能会在处理之前/之后截断。