@
är ett SQL*Plus-kommando
, det har ingen betydelse i PL/SQL. Ditt skript inkluderas i PL/SQL-blocket vid analystid, vilket du kan se om du list
koden i bufferten. Variablerna som deklareras i ditt kontrollblock är tillgängliga för den "inkluderade" koden direkt, utan att behöva ersättas.
Som ett exempel, om uitvoer.sql
innehåller bara:
dbms_output.put_line(v_s);
Sedan detta kontrollskript:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Producerar:
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-blocket i bufferten har den inkluderade koden, inte en referens till uitvoer.sql
. Men den inkluderade koden fungerade eftersom den hänvisade till en variabel från kontrollskriptet som fortfarande var inom räckvidden.
Om du vill tillåta att kontrollvariablerna har olika namn, tillåter du uitvoer.sql
för att kallas mer flexibelt kanske, då kan du fortfarande använda substitutionsvariabler, men du ersätter fortfarande variabelnamnet, inte dess värde. Till exempel med denna uitvoer.sql
(observera att substitutionsvariabeln inte gör det har citat runt det):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
Och ditt kontrollskript skickar variabelnamnet:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Du ser:
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;