2012-02-16 108 views
10

que quieren crear tabla temporal en el procedimiento almacenado y acceder a él de la misma pero ha obtenido un error que ORA-00942:Table or view does not exists. siguiente es el procedimiento que he intentado,¿Cómo crear y usar tablas temporales en el procedimiento almacenado de 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; 

Ésta es la forma en que utiliza para crear tabla temporal, pero Tengo un error, ¿hay alguna otra manera de realizar esta tarea?

+5

La respuesta de @ tbone muestra lo que debe hacer, pero para explicar lo que está viendo: No puede hacer esto porque en el momento en que se compila el procedimiento 'temp' aún no existe. El compilador no intenta analizar el SQL dinámico, sobre todo porque no tiene idea de si funcionará en tiempo de ejecución. La única forma en que funcionaría este enfoque es si el inserto se convirtió también en SQL dinámico; pero así no es como funcionan las tablas temporales en Oracle, así que no lo hagas así. –

+0

@Alex Poole: Gracias –

+0

posible duplicado de [Tabla temporal local en Oracle 10 (para el alcance del procedimiento almacenado)] (http://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10 -for-the-scope-of-stored-procedure) – APC

Respuesta

14

Simplemente créelo primero (una vez fuera de su procedimiento) y luego úselo en su procedimiento. No desea (intentar) crearlo en cada llamada del procedimiento.

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

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

¿Pero por qué? Lo encontré extraño. ES DECIR. Necesito una mesa "virtual". ¿Puedo crearlo dentro del procedimiento en sí? – Revious

+1

@ Gik25 si usa una tabla temporal real o usa otros enfoques depende de su situación específica. Tal vez publique una nueva pregunta con sus detalles, lo más probable es que obtenga algunas buenas respuestas. – tbone

+2

I segundo @Revious Tengo una necesidad de crear, usar y destruir tablas temporales con un Proc, a Oracle no le está gustando, ¿alguna idea? – ZeExplorer

-1

Utilice esta

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

Eso es realmente un mal consejo. Crea la temperatura tablas fuera de las cosas que insertan/actualizan/eliminan de ellas. – Mat

0

He editado esta respuesta como que estaba mal. Soy un converso reciente de MSSQL y debido a la forma en que Oracle implementa las tablas temporales globales, si realmente necesita usar tablas temporales, crearlas una vez y dejarlas allí, es el camino a seguir. A menos que use sql dinámico en sus procesos exclusivamente (tenga depuración divertida), no podrá compilar correctamente su paquete a menos que las tablas a las que se hace referencia ya existan. Oracle valida los objetos a los que se hace referencia en los métodos que intenta compilar, motivo por el cual obtuvo el error 942. Me encanta la forma en que Oracle maneja el alcance con estas tablas temporales globales. Eso, solo, me vendió la idea.

+0

Esto es generalmente una práctica realmente mala en Oracle. Las tablas no desaparecen simplemente de cualquier manera. ¿Por qué agregar código extra (lento), forzar SQL dinámico en todas partes y perder toda esperanza de administración de configuración? Las tablas temporales casi nunca son útiles de todos modos. Por lo general, se pueden reemplazar por tablas regulares, vistas en línea o una colección. –

+0

No importa mi respuesta, soy un converso reciente de MSSQL. En la última semana, he llegado a una mejor comprensión de la implementación de tablas temporales de Oracles. Cuanto más utilizo Oracle, más me gusta. – 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; 
Cuestiones relacionadas