Vraag Hoe maak en gebruik je tijdelijke tabel in oracle stored procedure?


Ik wil een tijdelijke tabel maken in de opgeslagen procedure en deze op dezelfde manier openen, maar ik heb een foutmelding gekregen ORA-00942:Table or view does not exists. Hieronder volgt de procedure die ik heb geprobeerd,

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;  

Dit is de manier waarop ik een tijdelijke tabel heb gemaakt, maar ik heb een fout gekregen, is er een andere manier om deze taak uit te voeren?


11
2018-02-16 11:56


oorsprong


antwoorden:


Maak het eerst (een keer, buiten uw procedure) en gebruik het vervolgens in uw procedure. Je wilt het niet (proberen te) maken bij elke aanroep van de procedure.

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

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

15
2018-02-16 12:05



Ik heb dit antwoord bewerkt omdat het verkeerd was. Ik ben een recente MSSQL-conversie en vanwege de manier waarop oracle globale temp-tabellen implementeert, als je echt tijdelijke tabellen nodig hebt, ze een keer maakt en ze achterlaat, is er de weg te gaan. Tenzij u dynamische sql uitsluitend in uw procs gebruikt (veel plezier bij het debuggen), kunt u uw pakket niet succesvol compileren tenzij de reeds genoemde tabellen al bestaan. Oracle valideert alle objecten waarnaar wordt verwezen in methoden die u probeert te compileren, en daarom heeft u de 942-fout ontvangen. Ik ben dol op de manier waarop Oracle het bereik met deze mondiale temp-tabellen beheert. Dat alleen al heeft me op dit idee verkocht.


0
2018-01-29 19:03



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
2018-06-23 03:48



Gebruik dit

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;

-2
2018-06-08 10:04