2011-01-23 10 views
9

Ho una procedura come:Come eseguire gli script SQL da una procedura di pl sql

CREATE OR REPLACE PROCEDURE test is 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('This is a Test'); 
END; 

voglio eseguire alcuni script SQL memorizzati nella directory corrente. Potrei eseguirli da sqlplus con '@ scriptname.sql' ma come posso farlo all'interno della procedura? Per esempio:

CREATE OR REPLACE PROCEDURE test is 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('This is a Test'); 
    @scriptname.sql 

END; 

Questo non sembra funzionare! Esiste uno specifico per eseguire script sql da procedure pl/sql?

+0

Mi sembra logico includere i riferimenti di script in una stored procedure (o anonimi, per quella questione), non menzionare il problema con la posizione dello script. È possibile eseguire script da un singolo script master utilizzando SQLPlus, senza la necessità della stored procedure. –

+0

Immagino che questa sia una grossolana semplificazione delle effettive necessità dell'OP ... – DCookie

risposta

1

È possibile scrivere un Java Stored Procedure per aprire il file e restituirne il contenuto come stringa, quindi chiamare Execute Immediate sulla stringa.

FARE MOLTO ATTENZIONE, tuttavia, poiché qualsiasi sql dannoso in questi file può fare praticamente tutto ciò che desidera.

+1

Questo non funzionerà se il file SQL contiene istruzioni SELECT (Dove dovrebbero andare i dati selezionati? Esegui Immediato non lo visualizzerà sullo schermo.) O Istruzioni SQLplus come EXEC, SET ESC, ecc. Inoltre, probabilmente avrete bisogno di leggere ed eseguire la dichiarazione per dichiarazione che non è facile neanche. – Codo

10

Non è possibile, in generale, perché pl/sql venga eseguito nel database, sul server e sqlplus è un processo client. Il server non può contare nemmeno sullo stesso sistema del client e dei suoi file, tanto meno sapere nulla su come trovare il file a cui fa riferimento il client. Anche se la sintassi fosse supportata (e non lo fosse), lo script sql dovrebbe trovarsi sul server, in una posizione a cui il server era a conoscenza e che aveva accesso.

+0

Se hai intenzione di downvotare una risposta, ti preghiamo di spiegare perché ... – DCookie

4

È possibile eseguire un comando del sistema operativo per avviare SQLPlus e fare in modo che eseguano gli script. È possibile passare un nome file in SQLplus all'avvio e verrà eseguito.

Procedure esterne di Google e extproc o this article. O qualcosa di simile call OS command with Java

+1

sì +1 - ma yikes - per favore non farlo per l'esecuzione di script ... – Randy

+0

E funziona ancora sul server, non sul client. – DCookie

+0

In realtà sul server o altrove è solo uno dei dettagli che dovranno essere codificati.Non sto certo dicendo che sarà facile, ma se è possibile eseguire codice sul server e farlo eseguire altrove. Ci sarà un casino di firewall, problemi RPC (o simili), ecc. Da risolvere ma è possibile. Non è qualcosa che vedrei molto merito, ma non conosco lo scenario del richiedente. – Karl

1

Anche se ci dovrebbe essere una soluzione, non consiglierei a questo. Una procedura PL/SQL è fondamentalmente uno script SQL. O 1. eseguire gli script SQL dall'esterno del database, ad es. tramite script di shell o 2. spostare il codice SQL all'interno della procedura.

8

In realtà, si può farlo in SQL * Plus - è sufficiente per garantire la @ è il primo carattere sulla linea, ad esempio:

CREATE OR REPLACE PROCEDURE test is 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('This is a Test'); 
@scriptname.sql 

END; 

SQL * Plus leggerà l'intero contenuto di lo script e inserirlo in quel punto della procedura, quindi creare la procedura così come viene fornita. Ciò significa che non è possibile avere comandi SQL * Plus in scriptname.sql. Inoltre, non ci sarà alcun riferimento a @ scriptname.sql nella procedura effettiva creata sul database.

Problemi correlati