我有一个PL/SQL过程,它创建一个临时表,然后使用游标从该临时表中提取数据,处理数据,然后删除临时表。但是,如果表不存在于数据库中,则Oracle不允许使用游标。在Oracle中创建游标之前创建表
请帮我解决这个问题。
我有一个PL/SQL过程,它创建一个临时表,然后使用游标从该临时表中提取数据,处理数据,然后删除临时表。但是,如果表不存在于数据库中,则Oracle不允许使用游标。在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;
/
(更多细节here - 尤其是,因为在所有的表名是固定的,而不是会话相关的这短短的PROC是不是安全的)。
这是(相当)有点丑陋,我不建议你使用它 - 相反,你应该考虑是否需要该程序特定的临时表。
不会动态创建它们[临时表],不要动态创建它们,请 - 不要动态创建。
难道你不能使用全局临时表吗?你真的需要临时表吗? (即不使用select语句上的光标来填充表格)?
或者,如果您希望避免全局临时表与“常规”永久表之间的差异,则可能会使用(关于临时表数据可用性,生命期等,请参阅Oracle docs),只需首先创建表(nologging)。假设没有其他人使用这个表格,你的过程可能在处理之前/之后截断。
为什么创建并删除临时表而不是创建一次,并一遍又一遍地使用它们? - 如果您来自SQL Server后台,Oracle则不同。临时表是持有临时数据的永久对象。 – 2011-12-26 02:29:04