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

データベースリンクを介してOracleでストアド関数(ユーザー定義型の配列を返す)を呼び出す

    私の知る限り、あなたが試しているのは正しい構文ですが、いずれにせよ、ご想像のとおり、戻り型がユーザー定義であるため、機能しません。

    パイプライン関数が組み込まれている例を次に示します。もちろん、ローカルで呼び出すことは機能します:

    SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'));
    

    返品:

    SQL_ID: a, child number: 1 cannot be found 
    

    データベースリンクを介して呼び出す:

    SELECT * FROM TABLE([email protected]('a',1,'ALL'));
    

    このエラーで失敗します:

    ORA-30626: function/procedure parameters of remote object types are not supported
    

    リンクがパッケージにアクセスできない特定のスキーマに移動するため、ORA-904を取得している可能性があります。ただし、いずれの場合も、ローカルスキーマで同じ名前で同じタイプを定義したとしても、Oracleの観点からは同じタイプではないため、これは機能しません。

    もちろん、ビューをリモートでクエリすることもできるため、可能なパラメータの明確なセットがある場合は、パラメータの組み合わせごとに1つのビューを作成し、それをクエリできます。例:

    CREATE VIEW display_cursor_a_1_all AS
      SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'))
      ;
    

    可能なパラメーター値の範囲が大きすぎる場合は、パラメーターのセットを指定して、必要なビューを動的に作成するプロシージャーを作成できます。次に、クエリを実行するたびに2段階のプロセスがあります。

    EXECUTE  [email protected](parameters)
    
    SELECT * FROM [email protected];
    

    次に、複数のセッションがこれを並行して呼び出す可能性があるかどうか、もしそうであれば、それらが互いに踏まないようにする方法を検討する必要があります。




    1. PostgreSQLで数値をフォーマットする方法

    2. データベース(SQL Serverなど)にトランザクションをコミットしないとどうなりますか?

    3. 結果キャッシュ

    4. サブクエリでビット単位のORを集約