@
est une commande SQL*Plus
, cela n'a aucune signification en PL/SQL. Votre script est inclus dans le bloc PL/SQL au moment de l'analyse, ce que vous pouvez voir si vous list
le code dans le tampon. Les variables déclarées dans votre bloc de contrôle sont directement disponibles pour le code "inclus", sans nécessiter de substitution.
Par exemple, si uitvoer.sql
contient juste :
dbms_output.put_line(v_s);
Puis ce script de contrôle :
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Produit :
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;
Le bloc PL/SQL dans le tampon a le code inclus, pas une référence à uitvoer.sql
. Mais le code inclus fonctionnait car il faisait référence à une variable du script de contrôle qui était toujours dans la portée.
Si vous souhaitez autoriser les variables de contrôle ayant des noms différents, autorisez uitvoer.sql
pour être appelé peut-être de manière plus flexible, vous pouvez toujours utiliser des variables de substitution, mais vous substituez toujours le nom de la variable, pas sa valeur. Par exemple, avec ce uitvoer.sql
(notez que l'affectation de la variable de substitution ne fait pas avoir des guillemets autour de lui):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
Et votre script de contrôle en passant le nom de la variable :
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Vous voyez :
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;