この問題に直面しているので、助けが必要です。リンクサーバーを介して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;
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プロバイダー。