Het is 2012 2017. Scripts zijn een onhandige en broze kater uit het laatste millennium. Oracle heeft een fantastisch scala aan functionaliteit die we kunnen uitvoeren in PL/SQL, plus er zijn Java Stored Procedures en er is een planning voor het starten van taken. Behalve het uitvoeren van DDL om schema's te maken of te wijzigen, zijn er nauwelijks scripts nodig in een Oracle-databaseomgeving; zelfs DDL-scripts moeten worden geactiveerd vanaf een externe client, waarschijnlijk een build-tool zoals TeamCity.
In het bijzonder zou ik het proberen om een SQL-script uit te voeren vanuit een PL/SQL-programma als een architectuurfout beschouwen. Wat doe je met het script dat je niet kunt doen met een opgeslagen procedure?
Wat betreft het doorgeven van invoer aan een opgeslagen procedure, daar zijn parameters voor. PL/SQL is niet interactief, we hebben een client nodig om de waarden in te voeren. Afhankelijk van het scenario kan dit asynchroon (waarden in een bestand of een tabel) of synchroon (aanroepen van de opgeslagen procedure vanuit SQL*Plus, SQL Developer of een op maat gemaakte frontend) gebeuren.
Dat gezegd hebbende, werken we in de echte wereld met rommelige architecturen met onderlinge afhankelijkheden tussen de database en het externe besturingssysteem. Dus wat kunnen we doen?
- We kunnen een Java Stored Procedure schrijven om shell-commando's uit te voeren. Dit is de eerbiedwaardige oplossing, die al bestaat sinds Oracle 8i. Meer informatie.
- In 10g vervangt Oracle DBMS_JOB door DBMS_SCHEDULER. Een van de verbeteringen van deze tool is de mogelijkheid om externe taken uit te voeren, d.w.z. shellscripts. Meer informatie.
- Sinds Oracle 11g R1 ondersteunen externe tabellen pre-processorscripts, die shell-commando's uitvoeren voordat de tabel wordt opgevraagd. Meer informatie.
Merk op dat al deze opties verhoogde toegang vereisen (toelagen op DIRECTORY-objecten, beveiligingsreferenties, enz.). Deze kunnen alleen worden verleend door bevoorrechte gebruikers (d.w.z. DBA's). Tenzij onze database een verbazingwekkend slappe beveiligingsconfiguratie heeft, is er voor ons geen manier om een willekeurig shellscript vanuit PL/SQL uit te voeren.
Ten slotte is het niet duidelijk welk voordeel u verwacht van het uitvoeren van een SQL-script in PL/SQL. Onthoud dat PL/SQL op de databaseserver draait, dus het kan geen scripts zien op de clientcomputer . Dit lijkt relevant in het licht van de vereiste om gebruikersinvoer te accepteren.
Misschien is de eenvoudigste oplossing het opnieuw configureren van het originele script. Splits de benodigde PL/SQL-aanroep op in een blok en roep dan gewoon het genoemde script aan:
begin
proc(para1,para2);
end;
/
@prompt1.sql