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)は、発生した場合に何を実行する必要があるかに応じてスローされます。