2012-02-16 13 views
10

Voglio creare tabella temporanea in stored procedure e l'accesso nella stessa, ma ho ottenuto l'errore che ORA-00942:Table or view does not exists. seguito è la procedura che ho provato,Come creare e utilizzare la tabella temporanea nella procedura memorizzata Oracle?

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; 

Questo è il modo che ho usato per creare tabella temporanea, ma Ho un errore, c'è un altro modo per eseguire questo compito?

+5

@ la risposta di tbone mostra cosa dovresti fare, ma per spiegare cosa stai vedendo: non puoi farlo perché al momento della compilazione della procedura 'temp' non esiste ancora. Il compilatore non tenta di analizzare l'SQL dinamico, non ultimo perché non ha idea se funzionerà in fase di runtime. L'unico modo in cui questo approccio funzionerebbe è se l'inserto fosse anch'esso convertito in SQL dinamico; ma questo non è il modo in cui le tabelle temporanee funzionano in Oracle, quindi non farlo in questo modo. –

+0

@Alex Poole: Grazie –

+0

possibile duplicato di [Tabella temporanea locale in Oracle 10 (per l'ambito della stored procedure)] (http://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10 -per-the-scope-of-stored-procedure) – APC

risposta

14

È sufficiente crearlo per primo (una volta, fuori dalla procedura), quindi utilizzarlo nella procedura. Non si desidera (provare a) crearlo ad ogni richiamo della procedura.

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

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

Ma perché? L'ho trovato strano OSSIA Ho bisogno di una tabella "virtuale". Posso crearlo all'interno della procedura stessa? – Revious

+1

@ Gik25 se si utilizza una tabella temporanea effettiva o si utilizzano altri approcci dipende dalla situazione specifica dell'utente. Magari postare una nuova domanda con le tue specifiche, molto probabilmente otterrai qualche buona risposta. – tbone

+2

I second @Revious Ho bisogno di creare, utilizzare e distruggere tabelle temporanee con un Proc, Oracle non gli piace, qualche idea? – ZeExplorer

-1

Utilizzare questa

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; 
+3

Questo è in realtà un cattivo consiglio. Crea la temp. tabelle al di fuori di cose che inseriscono/aggiorna/eliminano da esse. – Mat

0

Ho modificato questa risposta come era sbagliato. Sono un recente convertente MSSQL e, a causa del modo in cui oracle implementa le tabelle temporali globali, se davvero hai bisogno di usare le tabelle temporanee, crearle una volta e lasciarle lì è la strada da percorrere. A meno che non si usi esclusivamente sql dinamici nei proc (con il debugging divertente), non sarà possibile compilare correttamente il pacchetto a meno che esistano già le tabelle di riferimento. Oracle convalida qualsiasi oggetto a cui si fa riferimento nei metodi che si tenta di compilare, motivo per cui si ha l'errore 942. Adoro il modo in cui Oracle gestisce lo scope con queste tabelle temporali globali. Questo, da solo, mi ha venduto all'idea.

+0

Questo è in genere una pratica molto negativa in Oracle. Le tabelle non scompaiono semplicemente volenti o nolenti. Perché aggiungere codice (lento) extra, forzare l'SQL dinamico ovunque e perdere ogni speranza di gestione della configurazione? Le tabelle temporanee non sono quasi mai utili comunque. Di solito possono essere sostituiti da tabelle regolari, viste in linea o raccolte. –

+0

Non importa la mia risposta, sono un recente convertente MSSQL. Nell'ultima settimana, sono giunto a una migliore comprensione dell'implementazione di Oracle delle tabelle temporanee. Più uso Oracle, più mi piace. – swimswithbricks

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; 
Problemi correlati