sql >> データベース >  >> RDS >> Oracle

execute immedateを使用してローカルプロシージャを実行するにはどうすればよいですか?

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



    1. 数字と文字の文字列による自動インクリメント

    2. クエリでのPHPとMySQLのパフォーマンス(の場合、関数)

    3. テーブル式の基礎、パート8 – CTE、最適化の考慮事項の続き

    4. 新しいEntityManagerがMySQLから古いデータを取得することがある