2009-05-19 13 views
7

Piszę procedurę PL/SQL, która musi dynamicznie generować niektóre zapytania, z których jedna wymaga utworzenia tabeli tymczasowej z wykorzystaniem wyników z zapytania wziętego jako parametr.Dlaczego uruchomienie tej kwerendy za pomocą polecenia WYKONAJ NATYCHMIAST powoduje błąd?

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

To kompiluje poprawnie, ale nawet z bardzo prostych zapytań takimi jak:

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

rzuca ORA-00911: invalid character. Jeśli ręcznie uruchomię utworzone zapytanie, działa poprawnie. W tym momencie jestem w stanie określić, co jest przyczyną problemu.

+1

Mam nadzieję, że proces nie jest uruchamiany w normalnym toku zdarzeń przez aplikację ... dynamiczne DDL jest naprawdę odpowiednie tylko dla skryptów administracyjnych (na przykład do konfigurowania nowego środowiska). –

Odpowiedz

23

Spróbuj zgubić ";" od wewnątrz ciągu, który wykonujesz Natychmiast.

EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE tmp_tab AS (' || query || ')'; 
Powiązane problemy