Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tôi muốn truyền một đối số biến vào tệp SQL bên ngoài (PL / SQL với SQL * Plus)

@ 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển các giá trị được đọc từ tệp dưới dạng đầu vào cho truy vấn SQL trong Oracle

  2. Từ Thủ tục đã lưu, trả về tham số OUT &con trỏ OUT &kết quả phân tích cú pháp (Oracle)

  3. ORA-29283:thao tác tệp không hợp lệ ORA-06512:tại SYS.UTL_FILE, dòng 536

  4. Làm thế nào để nâng lại ngoại lệ pl / sql trong khối xử lý ngoại lệ?

  5. Hàm được lưu trữ trong Oracle không chèn giá trị vào bảng mong muốn