Amarilloが言ったように、動的セクションが使用するSQLスコープには存在しないため、ローカルで定義されたプロシージャを動的に実行することはできません。
あなたが説明する状況は、すべてのプロシージャが匿名ブロックのDECLAREで定義されているということです。 セクションとあなたはそれらのどれを実行するかをあなたに告げるクエリを実行しています-そしておそらくそれはあなたに渡す引数も与えます。 ifを使用できます / else コンストラクトまたはcase 次のような適切な手順を実行するステートメント:
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;
/
必要なのはWHENが1つだけです 条件と適切な手順は、各手順を呼び出します。 ELSEを持つこともできます 予期しないプロシージャ名をキャッチするか、CASE_NOT_FOUND 例外(ORA-06592)は、発生した場合に何を実行する必要があるかに応じてスローされます。