@
là một lệnh SQL * Plus
, nó không có nghĩa trong PL / SQL. Tập lệnh của bạn đang được bao gồm trong khối PL / SQL tại thời điểm phân tích cú pháp, bạn có thể thấy nếu bạn list
mã trong bộ đệm. Các biến được khai báo trong khối điều khiển của bạn có sẵn cho mã 'được bao gồm' trực tiếp mà không cần thay thế.
Ví dụ:if uitvoer.sql
chỉ chứa:
dbms_output.put_line(v_s);
Sau đó, tập lệnh điều khiển này:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Sản xuất:
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;
Khối PL / SQL trong bộ đệm có mã được bao gồm, không tham chiếu đến uitvoer.sql
. Nhưng mã được bao gồm đã hoạt động vì nó tham chiếu đến một biến từ tập lệnh điều khiển vẫn nằm trong phạm vi.
Nếu bạn muốn cho phép các biến điều khiển có tên khác nhau, hãy cho phép uitvoer.sql
Có lẽ để được gọi linh hoạt hơn, thì bạn vẫn có thể sử dụng các biến thay thế, nhưng bạn vẫn đang thay thế tên biến chứ không phải giá trị của nó. Ví dụ:với uitvoer.sql
này (lưu ý rằng điều khoản thay thế không không có dấu ngoặc kép xung quanh nó):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
Và tập lệnh điều khiển của bạn chuyển tên biến:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Bạn thấy:
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;