1

からOracleパッケージ関数を呼び出していますSQL Server 2008 R2が、次のエラーが発生します。

リンクサーバー「TEST」のOLEDBプロバイダー「OraOLEDB.Oracle」がメッセージ「ORA-06502:PL / SQL:数値または値のエラー:文字列バッファが小さすぎます」を返しました

これが私が行おうとしている電話です:

  DECLARE @p_pidm VARCHAR(8)
  DECLARE @p_emal_code VARCHAR(4)
  DECLARE @p_email_address VARCHAR(90)
  DECLARE @p_rowid VARCHAR(18) = NULL
  DECLARE @p_exists VARCHAR(1)

  SET @p_pidm = '11111'
  SET @p_emal_code = 'POA'
  SET @p_email_address = 'mytest@email.com'

  EXECUTE ('BEGIN ? := gb_email.f_exists(?,?,?,?);END;',@p_exists, @p_pidm, @p_emal_code, @p_email_address, @p_rowid)
  AT [TEST]

この呼び出しをSQLDeveloperで実行すると、正常に機能します。ここで実行しているクエリは次のとおりです。

set serveroutput on ;
DECLARE rec_exists VARCHAR2(1) ;
begin
rec_exists := gb_email.f_exists(11111,'POA','mytest@email.com',NULL);
DBMS_OUTPUT.PUT_LINE(rec_exists);
end;

のサイズを変更してみましたが、@p_existsVARCHAR(MAX)も起こりませんでした。宣言したすべての変数が、呼び出しているパッケージ/関数の定義と一致することを確認しました。

これは私が頻繁に行う必要のあることではないので、この問題を解決するための助けをいただければ幸いです。

関数の定義は次のとおりです。

FUNCTION f_exists(p_pidm          goremal.goremal_pidm%TYPE,
                  p_emal_code     goremal.goremal_emal_code%TYPE,
                  p_email_address goremal.goremal_email_address%TYPE,
                  p_rowid         gb_common.internal_record_id_type DEFAULT NULL)
  RETURN VARCHAR2


Checks to see if a record exists.   


Parameters  
 p_pidm The PIDM of the entity who owns this e-mail information. NUMBER(8) Required Key     
 p_emal_code The type of the e-mail address. VARCHAR2(4) Required Key     
 p_email_address The e-mail address. VARCHAR2(90) Required Key     
 p_rowid Database ROWID of record to be selected. VARCHAR2(18)     

Returns  
 Y if found, otherwise N.
4

1 に答える 1

3

さて、私は解決策を見つけました。パラメータを OUTPUT として指定できませんでした。作業クエリは次のとおりです。

  DECLARE @p_pidm VARCHAR(8)
  DECLARE @p_emal_code VARCHAR(4)
  DECLARE @p_email_address VARCHAR(90)
  DECLARE @p_rowid_out VARCHAR(18) = NULL
  DECLARE @p_rec_exists VARCHAR(1)

  SET @p_pidm = '11111'
  SET @p_emal_code = 'POA'
  SET @p_email_address = 'mytest@email.com'

  EXECUTE ('BEGIN ? := gb_email.f_exists(?,?,?,?);END;',@p_rec_exists OUTPUT, @p_pidm, @p_emal_code, @p_email_address, @p_rowid_out)
  AT [TEST]
  SELECT @p_rec_exists
于 2012-10-11T17:45:44.047 に答える