@
es un comando SQL*Plus
, no tiene significado en PL/SQL. Su secuencia de comandos se incluye dentro del bloque PL/SQL en el momento del análisis, que puede ver si list
el código en el búfer. Las variables declaradas en su bloque de control están disponibles para el código 'incluido' directamente, sin necesidad de sustitución.
Como ejemplo, si uitvoer.sql
solo contiene:
dbms_output.put_line(v_s);
Entonces este script de control:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Produce:
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;
El bloque PL/SQL en el búfer tiene el código incluido, no una referencia a uitvoer.sql
. Pero el código incluido funcionó porque se refería a una variable del script de control que todavía estaba dentro del alcance.
Si desea permitir que las variables de control tengan nombres diferentes, permita uitvoer.sql
para ser llamado de manera más flexible quizás, entonces aún puede usar variables de sustitución, pero aún está sustituyendo el nombre de la variable, no su valor. Por ejemplo, con este uitvoer.sql
(tenga en cuenta que la asignación de variable de sustitución no tiene comillas a su alrededor):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
Y su script de control pasando el nombre de la variable:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Ves:
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;