Как создать и использовать временную таблицу в хранимой процедуре оракула?

Я хочу создать временную таблицу в хранимой процедуре и получить к ней доступ тем же, но я получил ошибку, которая 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;  

Так я использовал для создания временной таблицы, но я получил ошибку, есть ли другой способ выполнить эту задачу?

Ответ 1

Просто создайте его сначала (один раз, вне вашей процедуры), а затем используйте его в своей процедуре. Вы не хотите (пытайтесь) создать его при каждом вызове процедуры.

create global temporary table tmp(x clob)
on commit delete rows;

create or replace procedure...
-- use tmp here
end;

Ответ 2

Я отредактировал этот ответ, поскольку это было неправильно. Я недавний конвертер MSSQL и из-за того, как oracle реализует глобальные таблицы temp, если вам действительно нужно использовать временные таблицы, создавая их один раз и оставляя их, есть путь. Если вы не используете динамический sql в своих procs исключительно (получайте удовольствие от отладки), вы не сможете успешно скомпилировать свой пакет, если только указанные таблицы не существуют. Oracle проверяет любые объекты, на которые ссылаются методы, которые вы пытаетесь скомпилировать, поэтому вы получили ошибку 942. Мне нравится, как Oracle управляет областью с этими глобальными временными таблицами. Это, в одиночку, продало меня по этой идее.

Ответ 3

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;

Ответ 4

Используйте этот

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;