我正在调用来自SQL Server 2008 R2
的Oracle打包函数,并收到以下错误:
返回链接服务器“TEST”的OLE DB提供程序“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]
如果我在SQL Developer中执行此调用,它可以正常工作。这是我在那里执行的查询:
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_exists
的大小更改为VARCHAR(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.
答案 0 :(得分: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