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

在Oracle中创建光标之前创建表,oracle,plsql,oracle10g,temp-tables,Oracle,Plsql,Oracle10g,Temp Tables,我有一个PL/SQL过程,它创建一个临时表,然后使用游标从这个临时表中提取数据,处理数据,然后删除临时表。但是,如果数据库中不存在表,Oracle不允许使用游标 请帮我处理这件事。你的说法不太正确。您可以使用光标进行任意查询。见下文: create or replace procedure fooproc IS type acursor is ref cursor; mycur acursor; mydate date; BEGIN execute immedi

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


请帮我处理这件事。

你的说法不太正确。您可以使用光标进行任意查询。见下文:

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;
/
更多细节-尤其是这个简短的过程根本不安全,因为表名是固定的,不依赖于会话

这有点难看,我并不是建议您使用它——相反,您应该考虑是否需要特定于过程的临时表

见:

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


您不能使用全局临时表吗?你真的需要一张临时桌子吗?i、 e.在用于填充该表的select语句上使用光标不是很有效吗?

或者,如果您希望避免全局临时表和常规永久表之间的差异,可以使用光标查看临时表数据可用性、生存期等,只需先创建表,然后取消记录即可。假设没有其他人使用此表,您的过程可能会在处理之前/之后截断。

为什么要创建临时表,然后删除它们,而不是创建一次,然后反复使用它们如果您来自SQL Server背景,Oracle则不同。临时表是保存临时数据的永久对象。