@
è un comando SQL*Plus
, non ha significato in PL/SQL. Il tuo script viene incluso nel blocco PL/SQL al momento dell'analisi, che puoi vedere se list
il codice nel buffer. Le variabili dichiarate nel tuo blocco di controllo sono disponibili direttamente al codice 'incluso', senza necessità di sostituzione.
Ad esempio, se uitvoer.sql
contiene solo:
dbms_output.put_line(v_s);
Quindi questo script di controllo:
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;
Il blocco PL/SQL nel buffer ha il codice incluso, non un riferimento a uitvoer.sql
. Ma il codice incluso ha funzionato perché si riferiva a una variabile dello script di controllo che era ancora nell'ambito.
Se si desidera consentire alle variabili di controllo di avere nomi diversi, consentire uitvoer.sql
per essere chiamato in modo più flessibile forse, puoi ancora usare le variabili di sostituzione, ma stai ancora sostituendo il nome della variabile, non il suo valore. Ad esempio, con questo uitvoer.sql
(nota che l'assegnazione della variabile di sostituzione non ci sono delle virgolette):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
E il tuo script di controllo che passa il nome della variabile:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Vedi:
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;