È il 2012 2017. Le sceneggiature sono una sbornia goffa e fragile dell'ultimo millennio. Oracle ha una fantastica gamma di funzionalità che possiamo eseguire in PL/SQL, oltre a Java Stored Procedures e c'è la pianificazione per l'avvio dei lavori. Oltre all'esecuzione di DDL per creare o modificare schemi, non c'è quasi bisogno di script in un ambiente di database Oracle; anche gli script DDL dovrebbero essere attivati da un client esterno, probabilmente uno strumento di compilazione come TeamCity.
In particolare, considererei il tentativo di eseguire uno script SQL da un programma PL/SQL come un errore dell'architettura. Cosa stai facendo con lo script che non puoi fare con una procedura memorizzata?
Per quanto riguarda il passaggio di input a una stored procedure, ecco a cosa servono i parametri. PL/SQL non è interattivo, abbiamo bisogno di un client per inserire i valori. A seconda dello scenario, ciò può essere eseguito in modo asincrono (valori in un file o in una tabella) o in modo sincrono (chiamando la stored procedure da SQL*Plus, SQL Developer o un front-end personalizzato).
Detto questo, nel mondo reale lavoriamo con architetture disordinate con interdipendenze tra il database e il sistema operativo esterno. Allora cosa possiamo fare?
- Possiamo scrivere una stored procedure Java per eseguire i comandi della shell. Questa è la soluzione venerabile, essendo in circolazione da Oracle 8i. Scopri di più.
- In 10g Oracle sostituisci DBMS_JOB con DBMS_SCHEDULER. Uno dei miglioramenti di questo strumento è la sua capacità di eseguire lavori esterni, ad esempio script di shell. Scopri di più.
- Poiché le tabelle esterne Oracle 11g R1 supportano gli script del preprocessore, che eseguono i comandi della shell prima di interrogare la tabella. Scopri di più.
Si noti che tutte queste opzioni richiedono un accesso elevato (concessioni su oggetti DIRECTORY, credenziali di sicurezza, ecc.). Questi possono essere concessi solo da utenti privilegiati (es. DBA). A meno che il nostro database non abbia una configurazione di sicurezza sorprendentemente permissiva, non c'è modo per noi di eseguire uno script di shell arbitrario da PL/SQL.
Infine, non è chiaro quale vantaggio ci si aspetta dall'esecuzione di uno script SQL in PL/SQL. Ricorda che PL/SQL viene eseguito sul server del database, quindi non può vedere gli script sulla macchina client . Ciò sembra pertinente alla luce dell'obbligo di accettare l'input dell'utente.
Forse la soluzione più semplice è la riconfigurazione dello script originale. Suddividi la chiamata PL/SQL necessaria in un blocco e quindi chiama semplicemente lo script denominato:
begin
proc(para1,para2);
end;
/
@prompt1.sql