@
je příkaz SQL*Plus
, nemá v PL/SQL žádný význam. Váš skript je v době analýzy zahrnut do bloku PL/SQL, což můžete vidět, pokud list
kód ve vyrovnávací paměti. Proměnné deklarované ve vašem řídicím bloku jsou dostupné pro 'zahrnutý' kód přímo, bez nutnosti substituce.
Například uitvoer.sql
obsahuje pouze:
dbms_output.put_line(v_s);
Pak tento řídicí skript:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Vyrábí:
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;
Blok PL/SQL ve vyrovnávací paměti má zahrnutý kód, ne odkaz na uitvoer.sql
. Ale zahrnutý kód fungoval, protože odkazoval na proměnnou z řídicího skriptu, který byl stále v rozsahu.
Pokud chcete povolit, aby řídicí proměnné měly různé názvy, povolte uitvoer.sql
chcete-li být voláni pružněji, pak můžete stále používat substituční proměnné, ale stále dosazujete název proměnné, nikoli její hodnotu. Například s tímto uitvoer.sql
(všimněte si, že přiřazení substituční proměnné není mít kolem něj uvozovky):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
A váš řídicí skript předávající název proměnné:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Vidíte:
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;