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.