@
is een SQL*Plus-opdracht
, heeft het geen betekenis in PL/SQL. Uw script wordt tijdens de parse-tijd in het PL/SQL-blok opgenomen, wat u kunt zien als u list
de code in de buffer. De variabelen die in uw controleblok zijn gedeclareerd, zijn direct beschikbaar voor de 'inbegrepen' code, zonder vervanging.
Als bijvoorbeeld uitvoer.sql
bevat alleen:
dbms_output.put_line(v_s);
Dan dit controlescript:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Produceert:
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;
Het PL/SQL-blok in de buffer heeft de meegeleverde code, niet een verwijzing naar uitvoer.sql
. Maar de meegeleverde code werkte omdat deze naar een variabele uit het controlescript verwees die nog steeds binnen het bereik was.
Als u wilt dat de controlevariabelen verschillende namen hebben, moet u uitvoer.sql
. toestaan om flexibeler genoemd te worden misschien, dan kun je nog steeds substitutievariabelen gebruiken, maar je vervangt nog steeds de naam van de variabele, niet de waarde ervan. Bijvoorbeeld met deze uitvoer.sql
(merk op dat de toewijzing van de vervangingsvariabele niet zet er aanhalingstekens omheen):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
En je controlescript geeft de variabelenaam door:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Je ziet:
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;