使用以下参数类型调用 Oracle 函数时
NUMBER(7,0)
VARCHAR2(8 BYTE)
VARCHAR2(4 BYTE)
DATE
并通过链接的 Oracle 服务器从 SQL Server 2008R2 返回类型NUMBER(14,5)
,我在 SQL Server 端声明参数变量如下:
numeric(7,0) -- also tried INT, BIGINT
varchar(8)
varchar(4)
datetime -- also tried DATE
并返回变量类型numeric(14,5)
exec ( 'BEGIN ? := db.pkg.getPrice(?,?,?,?); END;', @price, @id1, @id2, @curr, @ed ) AT ORASRV
调用失败并出现以下错误:
OLE DB provider "OraOLEDB.Oracle" for linked server "ORASRV" returned message "ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1".
我究竟做错了什么?
为了测试该功能,我使用了以下 PL/SQL 脚本,它运行良好(打印0
出的参数结果正确):
declare
c varchar2(4);
ed date;
res number(14,5);
begin
c := 'USD';
ed := to_date('22-MAY-14', 'DD-Mon-YYYY');
res := pkg.getPrice(214360, '129746', c, ed);
DBMS_OUTPUT.PUT_LINE(res);
end;
还创建了一个仅用于测试的函数:
create or replace FUNCTION getTest (
a IN VARCHAR2 -- also tried INTEGER
)
RETURN VARCHAR2 -- also tried INTEGER
IS
res VARCHAR2(1); -- also tried INTEGER
BEGIN
res := a;
RETURN res;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
当我按如下方式从 SQL Server 调用它时
declare @a varchar(1),@b varchar(1) -- also tried INT
select @b = 'a'
exec ( 'BEGIN ? := db.getTest(?); END;', @a, @b) AT ORASRV
我收到以下错误:
OLE DB provider "OraOLEDB.Oracle" for linked server "ORASRV" returned message "ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 1".
Msg 7215, Level 17, State 1, Line 172
Could not execute statement on remote server 'ORASRV'.
对于 Oracle 端的 INTEGER 和 SQL Server 端的 INT,消息只是"ORA-06502: PL/SQL: numeric or value error
您的数据类型应该没问题,但是您需要稍微更改您的调用并在 @price 之后添加 OUTPUT。我已经使用 getTest 函数在 INTEGER -> INT, VARCHAR2 -> VARCHAR, DATE -> Datetime 上针对 Oracle11g 进行了测试