@
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;