Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Führen Sie SCRIPT aus dem PL/SQL-Block aus

Es ist 2012 2017. Drehbücher sind ein klobiger und spröder Überbleibsel aus dem letzten Jahrtausend. Oracle hat eine fantastische Auswahl an Funktionen, die wir in PL/SQL ausführen können, außerdem gibt es gespeicherte Java-Prozeduren und eine Zeitplanung für das Starten von Jobs. Abgesehen von der Ausführung von DDL zum Erstellen oder Ändern von Schemata sind in einer Oracle-Datenbankumgebung kaum Skripts erforderlich. Sogar DDL-Skripte sollten von einem externen Client ausgelöst werden, wahrscheinlich einem Build-Tool wie TeamCity.

Insbesondere würde ich den Versuch, ein SQL-Skript von einem PL/SQL-Programm aus auszuführen, als Architekturfehler betrachten. Was machen Sie mit dem Skript, was Sie mit einer gespeicherten Prozedur nicht tun können?

Was die Übergabe von Eingaben an eine gespeicherte Prozedur betrifft, so sind Parameter dafür da. PL/SQL ist nicht interaktiv, wir brauchen einen Client, um die Werte einzugeben. Je nach Szenario kann dies asynchron (Werte in einer Datei oder einer Tabelle) oder synchron (Aufruf der gespeicherten Prozedur von SQL*Plus, SQL Developer oder einem maßgeschneiderten Frontend) erfolgen.

Abgesehen davon arbeiten wir in der realen Welt mit chaotischen Architekturen mit gegenseitigen Abhängigkeiten zwischen der Datenbank und dem externen Betriebssystem. Was können wir also tun?

  1. Wir können eine gespeicherte Java-Prozedur schreiben, um Shell-Befehle auszuführen. Dies ist die altehrwürdige Lösung, die es seit Oracle 8i gibt. Erfahren Sie mehr.
  2. Ersetzen Sie in 10g Oracle DBMS_JOB durch DBMS_SCHEDULER. Eine der Verbesserungen dieses Tools ist seine Fähigkeit, externe Jobs auszuführen, z. B. Shell-Skripte. Erfahren Sie mehr.
  3. Seit Oracle 11g R1 unterstützen externe Tabellen Präprozessorskripte, die Shell-Befehle ausführen, bevor sie die Tabelle abfragen. Erfahren Sie mehr.

Beachten Sie, dass alle diese Optionen erhöhten Zugriff erfordern (Erteilungen für DIRECTORY-Objekte, Sicherheitsanmeldeinformationen usw.). Diese können nur von privilegierten Benutzern (d. h. DBAs) gewährt werden. Wenn unsere Datenbank keine erstaunlich lockere Sicherheitskonfiguration hat, gibt es für uns keine Möglichkeit, ein beliebiges Shell-Skript von PL/SQL aus auszuführen.

Schließlich ist nicht klar, welchen Nutzen Sie von der Ausführung eines SQL-Skripts in PL/SQL erwarten. Denken Sie daran, dass PL/SQL auf dem Datenbankserver läuft, also es keine Skripte auf dem Client-Rechner sehen kann . Dies erscheint angesichts der Anforderung, Benutzereingaben zu akzeptieren, relevant.

Die vielleicht einfachste Lösung ist die Neukonfiguration des ursprünglichen Skripts. Teilen Sie den notwendigen PL/SQL-Aufruf in einen Block auf und rufen Sie dann einfach das benannte Skript auf:

begin
   proc(para1,para2);
end;
/   
@prompt1.sql