@
е SQL*Plus команда
, няма значение в PL/SQL. Вашият скрипт е включен в PL/SQL блока по време на анализ, което можете да видите, ако list
кода в буфера. Променливите, декларирани във вашия контролен блок, са достъпни директно за „включения“ код, без да е необходимо заместване.
Като пример, ако uitvoer.sql
просто съдържа:
dbms_output.put_line(v_s);
Тогава този контролен скрипт:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Произвежда:
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 блокът в буфера има включен код, не препратка към uitvoer.sql
. Но включеният код работи, защото препращаше към променлива от контролния скрипт, която все още беше в обхвата.
Ако искате да разрешите контролните променливи да имат различни имена, разрешите uitvoer.sql
за да се извиква по-гъвкаво може би, тогава все още можете да използвате заместващи променливи, но все още замествате името на променливата, а не нейната стойност. Например с този uitvoer.sql
(обърнете внимание, че заместващата променлива assginment не има кавички около него):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
И вашият контролен скрипт, предаващ името на променливата:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Виждате:
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;