web-dev-qa-db-ja.com

LINK SERVERを介してマルチアウトパラメーターでOracle関数を呼び出す方法

この問題に直面しているので、助けが必要です。リンクサーバーを介して2つの出力パラメーターを関数に渡すと、このエラーが発生します。 1つの出力パラメーターの場合は正常に機能しますが、2つの出力パラメーターを使用すると、次のエラーが発生します。

「メッセージ7215、レベル17、状態1、プロシージャFunction_Name、行28は、リモートサーバー ‘linkserver_name’でステートメントを実行できませんでした。」

これがクエリです:

DECLARE @RET INT

EXECUTE (‘BEGIN ? := package_name.function_name(?,?,?,?,?,?,?,?,?,?,?,?,?); END;’, @RET OUTPUT
, @USER_NAME, @FIRST_NAME, @MIDDLE_NAME, @LAST_NAME, @DATE_OF_BIRTH
, @MOTHER_MAIDEN_NAME, @MOBILE_NO, @P_NATIONAL_ID, @NATIONAL_ID_EXP_DT, @PASSPORT_NO, @PPT_EXP_DATE
, @ERROR_CODE OUTPUT, @ERROR_DESCRIPTION OUTPUT )
AT linkserver_name;
1
Obaid Altaf

StackOverflowのこの回答 で言及されているのと同じトリックを試すことができます。

あなたの場合、EXECUTEのSQLステートメント文字列は次のようになります。

DECLARE 
  vRetValue number;  
  vErrorCode varchar2(100);
  vErrorDescription varchar2(4000);
  vRetCursor sys_refcursor;
BEGIN 
  vRetValue := package_name.function_name(?,?,?,?,?,?,?,?,?,?,?,vErrorCode, vErrorDescription); 
  open vRetCursor for select vRetValue, vErrorCode, vErrorDescription from dual;
  ? := vRetCursor;
END;

そして、次のようにこのコードを呼び出します。

DECLARE @RET_CURSOR CURSOR;

EXECUTE (
  'DECLARE '+
  '  vRetValue number;  '+
  '  vErrorCode varchar2(100); '+
  '  vErrorDescription varchar2(4000); '+
  '  vRetCursor sys_refcursor; '+
  'BEGIN '+
  '  vRetValue := package_name.function_name(?,?,?,?,?,?,?,?,?,?,?,vErrorCode, vErrorDescription); '+
  '  open vRetCursor for select vRetValue, vErrorCode, vErrorDescription from dual; '+
  '  ? := vRetCursor; '+
  'END;' ,
  @USER_NAME, @FIRST_NAME, @MIDDLE_NAME, @LAST_NAME, @DATE_OF_BIRTH,
  @MOTHER_MAIDEN_NAME, @MOBILE_NO, @P_NATIONAL_ID, @NATIONAL_ID_EXP_DT, 
  @PASSPORT_NO, @PPT_EXP_DATE,
  @RET_CURSOR OUTPUT
) AT linkserver_name;

申し訳ありませんが、構文を確認することはできませんが、その原則が十分に明確であることを願っています。

もう1つは、上記のコードが回避策であり、複数の出力パラメーターを持つコードがまったく機能しない場合にのみ使用する必要があることです。
そのような動作の最も可能性の高い原因は、バグまたはMSのバージョンの非互換性ですOLE OracleまたはOracleクライアント用のDBプロバイダー。

2
ThinkJet