none
SQL ServerからOracleファンクションの実行方法

    質問

  • SQL Server2014からOracle 12cのファンクションを実行する方法を探しています。

    Oracle側のテーブルデータの読み込みや書き込みはOracle Providerを使用したリンクサーバによって実現できますが、ファンクション(ストアド)の呼び出し、実行がどうしてもできません。

    例えば、

    EXEC ('ORACLE_FUNCTION_AAA',@return_value) AT ORACLE_DB_LINK;

    とやってみてもエラー:7215となってしまいます。

    どうしたらOracleファンクションを実行することができるでしょうか。

    それともSQL Server側からOracleファンクションを呼び出すことはできないのでしょうか。

    よろしくお願いいたします。

    2017年10月27日 0:44

すべての返信

  • 確かめる環境がありませんが、リンクサーバー上のストアドプロシージャの実行であれば、以下が参考になるのではないかと思います。

    sp_executesql を使用して、リンクサーバーでストアドプロシージャを実行、結果を一時テーブルにINSERTする。
    https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/72e493df-7e7a-4079-9225-4ca6a7359dd8/spexecutesql-insert?forum=sqlserverja


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年10月27日 4:08
  • trapemiya様

    情報ありがとうございます。

    以下のようなコマンドに書き換えたところエラーはなくなりましたが、戻り値が取得できません。
    ---
    CREATE TABLE #myTmpTbl(col1 int)

    DECLARE @tsql NVARCHAR(MAX)
    DECLARE @tsql2 NVARCHAR(MAX)
    DECLARE @srvname NVARCHAR(MAX)

    SET @srvname = '[ORACLE_DB_LINK]'
    SET @tsql = 'EXEC (''' + 'EXECUTE :ret := [ORACLE_FUNCTION];' + ''') AT ' + @srvname + ''
    SET @tsql2 = 'INSERT INTO #myTmpTbl ' + @tsql

    EXEC sp_executesql @tsql2

    SELECT * FROM #myTmpTbl;
    DROP TABLE #myTmpTbl;
    ---

    「:ret := 」の部分を消してファンクションだけにするとOracle側からコマンドが正しくないと帰ってきてしまい、どうすればよいかわかりません。
    「OLE DB プロバイダー "OraOLEDB.Oracle" から、メッセージ "ORA-00900: invalid SQL statement" が返されました。」

    以上、よろしくお願いいたします。

    2017年10月30日 0:12