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

Làm thế nào để thực thi một thủ tục cục bộ bằng cách sử dụng thực thi immedate?

Như Amarillo đã nói, bạn không thể thực thi động một thủ tục được xác định cục bộ, vì nó không tồn tại trong phạm vi SQL mà phần động sẽ sử dụng.

Tình huống bạn mô tả là tất cả các thủ tục được xác định trong DECLARE của khối ẩn danh và bạn đang chạy một truy vấn cho bạn biết chúng sẽ thực thi cái nào - và có lẽ điều đó cũng cung cấp cho bạn các đối số để chuyển. Bạn chỉ có thể sử dụng if / else cấu trúc hoặc một case câu lệnh để thực thi các thủ tục thích hợp, chẳng hạn như:

DECLARE
  ...
BEGIN
  FOR data IN (SELECT procname, arg1, arg2, ... from <your_query>) LOOP
    CASE data.procname
      WHEN 'OPENLOG' THEN
        openlog(data.arg1);
      WHEN 'WRITELOG' THEN
        writelog(data.arg1, data.arg2);
      WHEN ...
        ...
      ELSE
         -- handle/report an invalid procedure name
         -- or skip the `ELSE` and let CASE_NOT_FOUND be thrown
    END CASE;
  END LOOP;
END;
/

Bạn chỉ cần một WHEN điều kiện và lệnh gọi thủ tục thích hợp cho mỗi thủ tục. Bạn cũng có thể có ELSE để bắt bất kỳ tên thủ tục không mong muốn nào hoặc đặt CASE_NOT_FOUND ngoại lệ (ORA-06592) được đưa ra, tùy thuộc vào những gì bạn cần xảy ra nếu điều đó xảy ra.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao Oracle SQL Optimizer bỏ qua vị từ chỉ mục cho chế độ xem này?

  2. Tại sao Oracle trả về chuỗi cụ thể nếu các giá trị 'orderby' giống nhau?

  3. Tải dữ liệu từ * .xlsx hoặc * .xls vào bảng Oracle từ tài khoản Người dùng Oracle Apex 4.0.2

  4. Oracle, cách mở con trỏ và chọn một cột trong số nhiều cột vào một biến

  5. Đặt thời gian chờ kết nối cơ sở dữ liệu Oracle 10g trong Java