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

Jeg vil sende et variabelt argument til ekstern SQL-fil (PL/SQL med SQL*Plus)

@ er en SQL*Plus-kommando , det har ingen betydning i PL/SQL. Dit script bliver inkluderet i PL/SQL-blokken på parsetidspunktet, hvilket du kan se, hvis du list koden i bufferen. Variablerne, der er deklareret i din kontrolblok, er tilgængelige for den 'inkluderede' kode direkte uden at skulle erstattes.

Som et eksempel, hvis uitvoer.sql indeholder kun:

dbms_output.put_line(v_s);

Derefter dette kontrolscript:

set serveroutput on
declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql
end;
/

list

Producerer:

Test

PL/SQL procedure successfully completed.

  1  declare
  2    v_s varchar2(10) := 'Test';
  3  begin
  4  dbms_output.put_line(v_s);
  5* end;

PL/SQL-blokken i bufferen har den inkluderede kode, ikke en reference til uitvoer.sql . Men den inkluderede kode virkede, fordi den henviste til en variabel fra kontrolscriptet, som stadig var i scope.

Hvis du vil tillade, at kontrolvariablerne har forskellige navne, tillader du uitvoer.sql for at blive kaldt mere fleksibelt måske, så kan du stadig bruge substitutionsvariabler, men du erstatter stadig variabelnavnet, ikke dets værdi. For eksempel med denne uitvoer.sql (bemærk, at erstatningsvariablen ikke gør det). har citater omkring det):

declare
  variable_s varchar2(10);
begin
  variable_s := &&1;
  dbms_output.put_line(variable_s);
end;

Og dit kontrolscript sender variabelnavnet:

declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql v_s
end;
/

Du kan se:

old   7:   variable_s := &&1;
new   7:   variable_s := v_s;
Test

PL/SQL procedure successfully completed.

  1  declare
  2    v_s varchar2(10) := 'Test';
  3  begin
  4  declare
  5    variable_s varchar2(10);
  6  begin
  7    variable_s := &&1;
  8    dbms_output.put_line(variable_s);
  9  end;
 10* end;



  1. Oracle sql eller pl/sql:Beregn baseret på tidligere rækkeværdier og på datokolonnen

  2. Doktrin - Hvordan udskriver man den rigtige sql, ikke kun den forberedte erklæring?

  3. Hvilken tidsstempeltype skal jeg vælge i en PostgreSQL-database?

  4. Ret forespørgsel for at få det aktuelle antal forbindelser i en PostgreSQL DB