2009-05-19 7 views
7

Я пишу процедуру PL/SQL, которая должна динамически генерировать некоторые запросы, одна из которых предполагает создание временной таблицы с использованием результатов запроса, взятого в качестве параметра.Почему выполнение этого запроса с помощью EXECUTE IMMEDIATE приводит к сбою?

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

Он компилирует правильно, но даже при очень простых запросов, таких как с:

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

IT бросает ORA-00911: invalid character. Если я запустил созданный запрос вручную, он будет работать правильно. На этом этапе я могу определить, что вызывает проблему.

+1

Я надеюсь, что прок не запущен в нормальном ходе событий по вашему приложению ... динамический DDL только действительно подходит для администратора сценариев (например, устанавливающих новую среду). –

ответ

23

Попытайтесь потерять «;» изнутри строки, которую вы выполняете немедленно.

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

 Смежные вопросы

  • Нет связанных вопросов^_^