Как создать и использовать временную таблицу в хранимой процедуре Oracle? - PullRequest
13 голосов
/ 16 февраля 2012

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

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

Ответы [ 5 ]

16 голосов
/ 16 февраля 2012

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

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

create or replace procedure...
-- use tmp here
end;
0 голосов
/ 03 октября 2018
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;
/
0 голосов
/ 23 июня 2015
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;
0 голосов
/ 29 января 2014

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

0 голосов
/ 08 июня 2013

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...