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

Ich möchte ein Variablenargument an eine externe SQL-Datei übergeben (PL/SQL mit SQL*Plus)

@ ist ein SQL*Plus-Befehl , hat es in PL/SQL keine Bedeutung. Ihr Skript wird zur Analysezeit in den PL/SQL-Block eingefügt, was Sie sehen können, wenn Sie list der Code im Puffer. Die in Ihrem Kontrollblock deklarierten Variablen stehen dem 'eingeschlossenen' Code direkt zur Verfügung, ohne dass eine Ersetzung erforderlich ist.

Als Beispiel, wenn uitvoer.sql enthält nur:

dbms_output.put_line(v_s);

Dann dieses Kontrollskript:

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

list

Erzeugt:

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;

Der PL/SQL-Block im Puffer enthält den enthaltenen Code, nicht ein Verweis auf uitvoer.sql . Aber der enthaltene Code funktionierte, weil er auf eine Variable aus dem Kontrollskript verwies, die noch im Geltungsbereich war.

Wenn Sie zulassen möchten, dass die Steuervariablen unterschiedliche Namen haben, lassen Sie uitvoer.sql zu um vielleicht flexibler aufgerufen zu werden, dann können Sie immer noch Substitutionsvariablen verwenden, aber Sie ersetzen immer noch den Variablennamen, nicht ihren Wert. Zum Beispiel mit dieser uitvoer.sql (Beachten Sie, dass die Substitutionsvariablenzuweisung nicht Anführungszeichen haben):

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

Und Ihr Kontrollskript übergibt den Variablennamen:

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

Sie sehen:

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;