@
é um comando SQL*Plus
, não tem significado em PL/SQL. Seu script está sendo incluído no bloco PL/SQL no momento da análise, o que você pode ver se list
o código no buffer. As variáveis declaradas em seu bloco de controle estão disponíveis para o código 'incluído' diretamente, sem necessidade de substituição. Por exemplo, se
uitvoer.sql
contém apenas:dbms_output.put_line(v_s);
Então este script de controle:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Produz:
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;
O bloco PL/SQL no buffer tem o código incluído, não uma referência a
uitvoer.sql
. Mas o código incluído funcionou porque se referia a uma variável do script de controle que ainda estava no escopo. Se você deseja permitir que as variáveis de controle tenham nomes diferentes, permitindo
uitvoer.sql
para ser chamado de forma mais flexível, talvez, você ainda pode usar variáveis de substituição, mas ainda está substituindo o nome da variável, não seu valor. Por exemplo, com este uitvoer.sql
(observe que a atribuição da variável de substituição não tem aspas em torno dele):declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
E seu script de controle passando o nome da variável:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Você vê:
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;