2009-05-19 13 views
7

Estoy escribiendo un procedimiento PL/SQL que necesita generar dinámicamente algunas consultas, una de las cuales consiste en crear una tabla temporal utilizando los resultados de una consulta tomada como un parámetro.¿Por qué ejecutar esta consulta con EXECUTE IMMEDIATE hace que falle?

CREATE OR REPLACE PROCEDURE sqlout(query IN VARCHAR2) 
IS 
BEGIN 
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE tmp_tab AS (' || query || ');'; 
END; 

Se compila correctamente, pero incluso con consultas muy simples, como con:

BEGIN 
    sqlout('SELECT * FROM DUAL'); 
END; 

arroja ORA-00911: invalid character. Si ejecuto la consulta creada manualmente, se ejecuta correctamente. En este punto, puedo determinar qué está causando el problema.

+1

espero que proc no se está ejecutando en el curso normal de los acontecimientos de su aplicación ... dinámica DDL sólo es realmente adecuado para secuencias de comandos de administración (por ejemplo, la creación de un nuevo entorno). –

Respuesta

23

tratar de perder el ";" desde dentro de la cadena que ejecutas Inmediatamente.

EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE tmp_tab AS (' || query || ')'; 
Cuestiones relacionadas