我想在存储过程中创建临时表并以相同的方式访问它但我收到错误ORA-00942:Table or view does not exists.
以下是我尝试的程序,
Create procedure myproc
IS
stmt varchar2(1000);
BEGIN
stmt:='CREATE GLOBAL TEMPORARY table temp(list if columns) ON COMMIT DELETE ROWS';
execute immediate stmt;
insert into temp values('list of column values');
END;
这是我用来创建临时表的方式,但是我遇到了错误,有没有其他方法可以执行此任务?
答案 0 :(得分:16)
首先创建它(一次,在您的程序之外),然后在您的过程中使用它。您不希望(尝试)在每次调用过程时创建它。
create global temporary table tmp(x clob)
on commit delete rows;
create or replace procedure...
-- use tmp here
end;
答案 1 :(得分:0)
我已经编辑了这个答案,因为它错了。我是最近的MSSQL转换器,并且由于oracle实现全局临时表的方式,如果你真的需要使用临时表,创建它们一次并留下它们就可以了。除非你在procs中独家使用动态sql(有趣的调试),否则除非引用的表已经存在,否则你将无法成功编译包。 Oracle验证您尝试编译的方法中引用的任何对象,这就是您收到942错误的原因。我喜欢Oracle使用这些全局临时表管理范围的方式。仅此一点,就把这个想法卖给了我。
答案 2 :(得分:0)
Create or replace procedure myprocedure
is
stmt varchar2(1000);
stmt2 varchar2(1000);
begin
stmt := 'create global temporary table temp(id number(10))';
execute immediate stmt;
stmt2 := 'insert into temp(id) values (10)';
execute immediate stmt2;
end;
答案 3 :(得分:-1)
CREATE OR REPLACE PROCEDURE myproc IS
BEGIN
CREATE GLOBAL TEMPORARY TABLE temp (id NUMBER(10)) ON COMMIT DELETE ROWS AS
SELECT 10 FROM dual;
END;
/
答案 4 :(得分:-2)
使用此
Create of replace procedure myprocedure
is
stmt varchar2(1000);
stmt2 varchar2(1000);
begin
stmt := 'create global temporary table temp(id number(10))';
execute immediate stmt;
stmt2 := 'insert into temp(id) values (10)';
execute immediate stmt2;
end;