sql >> Databasteknik >  >> RDS >> Oracle

Kör SCRIPT från PL/SQL Block

Det är 2012 2017. Manus är en klumpig och spröd baksmälla från förra årtusendet. Oracle har ett fantastiskt utbud av funktioner som vi kan köra i PL/SQL, plus det finns Java Stored Procedures och det finns schemaläggning för start av jobb. Förutom att köra DDL för att skapa eller ändra scheman finns det knappast något behov av skript i en Oracle-databasmiljö; även DDL-skript bör triggas från en extern klient, förmodligen ett byggverktyg som TeamCity.

I synnerhet skulle jag betrakta försök att köra ett SQL-skript från ett PL/SQL-program som ett arkitektoniskt misslyckande. Vad gör du med skriptet som du inte kan göra med en lagrad procedur?

När det gäller att skicka indata till en lagrad procedur, det är vad parametrarna är till för. PL/SQL är inte interaktiv, vi behöver en klient för att ange värdena. Beroende på scenariot kan detta göras asynkront (värden i en fil eller en tabell) eller synkront (anropar den lagrade proceduren från SQL*Plus, SQL Developer eller ett skräddarsytt gränssnitt).

Med det sagt, i den verkliga världen arbetar vi med röriga arkitekturer med ömsesidigt beroende mellan databasen och det externa operativsystemet. Så vad kan vi göra?

  1. Vi kan skriva en lagrad Java-procedur för att utföra skalkommandon. Detta är den ärevördiga lösningen, som har funnits sedan Oracle 8i. Ta reda på mer.
  2. I 10g Oracle ersätt DBMS_JOB med DBMS_SCHEDULER. En av förbättringarna av detta verktyg är dess förmåga att köra externa jobb, dvs skalskript. Ta reda på mer.
  3. Eftersom externa tabeller i Oracle 11g R1 stöder pre-processor skript, som kör skalkommandon innan du frågar tabellen. Ta reda på mer.

Observera att alla dessa alternativ kräver förhöjd åtkomst (bidrag på DIRECTORY-objekt, säkerhetsuppgifter, etc). Dessa kan endast beviljas av privilegierade användare (dvs. DBA). Om inte vår databas har en förvånansvärt slapp säkerhetskonfiguration finns det inget sätt för oss att köra ett godtyckligt skalskript från PL/SQL.

Slutligen är det inte klart vilken fördel du förväntar dig av att köra ett SQL-skript i PL/SQL. Kom ihåg att PL/SQL körs på databasservern, så det kan inte se skript på klientdatorn . Detta verkar relevant i ljuset av kravet att acceptera användarinput.

Den kanske enklaste lösningen är omkonfigurering av originalskriptet. Dela upp det nödvändiga PL/SQL-anropet i ett block och anrop sedan bara det namngivna skriptet:

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


  1. Laravel-5 "LIKE" motsvarighet (vältalande)

  2. Hur man returnerar bråkdelar av sekunder från ett Datetime-värde i Oracle

  3. Neo4j - Släpp ett index med Cypher

  4. Starka referensmarkörer med tabellbaserad postdatatyp