sql >> Database teknologi >  >> RDS >> Oracle

Kør SCRIPT fra PL/SQL Block

Det er 2012 2017. Manuskripter er et klodset og sprødt tømmermænd fra det sidste årtusinde. Oracle har en fantastisk række funktioner, vi kan udføre i PL/SQL, plus der er Java Stored Procedures, og der er tidsplan for start af job. Ud over at køre DDL for at oprette eller ændre skemaer er der næppe behov for scripts i et Oracle-databasemiljø; selv DDL-scripts bør udløses fra en ekstern klient, sandsynligvis et byggeværktøj såsom TeamCity.

Især vil jeg betragte forsøg på at køre et SQL-script fra et PL/SQL-program som en arkitektonisk fejl. Hvad laver du med scriptet, som du ikke kan med en lagret procedure?

Med hensyn til at sende input til en lagret procedure, er det det, parametrene er til. PL/SQL er ikke interaktiv, vi har brug for en klient til at indtaste værdierne. Afhængigt af scenariet kan dette gøres asynkront (værdier i en fil eller en tabel) eller synkront (kalder den lagrede procedure fra SQL*Plus, SQL Developer eller en skræddersyet frontend).

Når det er sagt, arbejder vi i den virkelige verden med rodede arkitekturer med indbyrdes afhængigheder mellem databasen og det eksterne OS. Så hvad kan vi gøre?

  1. Vi kan skrive en Java Stored Procedure til at udføre shell-kommandoer. Dette er den ærværdige løsning, der har eksisteret siden Oracle 8i. Få mere at vide.
  2. Erstat DBMS_JOB med DBMS_SCHEDULER i 10g Oracle. En af forbedringerne af dette værktøj er dets evne til at køre eksterne job, dvs. shell-scripts. Få mere at vide.
  3. Siden Oracle 11g R1 eksterne tabeller understøtter pre-processor scripts, som kører shell-kommandoer, før de forespørger tabellen. Få mere at vide.

Bemærk, at alle disse muligheder kræver forhøjet adgang (tilskud til DIRECTORY-objekter, sikkerhedsoplysninger osv.). Disse kan kun gives af privilegerede brugere (dvs. DBA'er). Medmindre vores database har en forbavsende slap sikkerhedskonfiguration, er der ingen måde for os at køre et vilkårligt shell-script fra PL/SQL.

Endelig er det ikke klart, hvilken fordel du forventer af at køre et SQL-script i PL/SQL. Husk at PL/SQL kører på databaseserveren, så den kan ikke se scripts på klientmaskinen . Dette forekommer relevant i lyset af kravet om at acceptere brugerinput.

Den måske enkleste løsning er omkonfiguration af det originale script. Opdel det nødvendige PL/SQL-kald i en blok, og kald så bare det navngivne script:

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


  1. CodeIgniter MSSQL-forbindelse

  2. PostgreSQL:Deaktiver midlertidigt forbindelser

  3. Guide til designdatabase til online indkøbskurv i MySQL

  4. Sådan tilføjer du rangordnede positioner af rækker i SQL med RANK()