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