Seperti yang dikatakan Amarillo, Anda tidak dapat menjalankan prosedur yang ditentukan secara lokal secara dinamis, karena tidak ada dalam lingkup SQL yang akan digunakan bagian dinamis.
Situasi yang Anda gambarkan adalah bahwa semua prosedur didefinisikan dalam blok anonim DECLARE
bagian dan Anda menjalankan kueri yang memberi tahu Anda mana yang harus dieksekusi - dan mungkin yang juga memberi Anda argumen untuk diteruskan. Anda cukup menggunakan if
/else
konstruksi atau case
pernyataan untuk menjalankan prosedur yang sesuai, seperti:
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;
/
Anda hanya perlu satu WHEN
kondisi dan panggilan prosedur yang tepat untuk setiap prosedur. Anda juga dapat memiliki ELSE
untuk menangkap nama prosedur yang tidak terduga atau membiarkan CASE_NOT_FOUND
pengecualian (ORA-06592) dilempar, tergantung pada apa yang Anda butuhkan untuk terjadi jika itu terjadi.