问 1:
每当 Oracle SP 想要返回错误代码/消息时,它都无法返回以下异常:
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 "DB.GET_COST", line 244
ORA-01403: no data found
ORA-06512: at line 1".
我通过链接服务器从 MS SQL 调用它,如下所示:
declare
@id1 int
,@id2 varchar(8)
,@code varchar(10)
,@curr varchar(4)
,@ed datetime
,@return_status int
,@error_code varchar(10)
,@error_msg varchar
,@landed_cost numeric(14,5)
begin try
exec ('BEGIN db.get_cost(?,?,?,?,?,?,?,?,?); END;'
,@code
,@id1
,@id2
,@curr
,@ed
,@return_status output
,@error_code output
,@error_msg output
,@cost output
) AT ORASRV
end try
begin catch
select
@return_status as return_status
,@error_code as error_code
,@error_msg as error_msg
end catch
输入参数似乎工作正常,因为它们的值使得当 SP 返回正确的结果时,一切正常。当抛出上述错误时,只有 IN 参数值可能导致 SP 返回错误代码。
Oracle端的声明如下:
PROCEDURE get_cost (
code IN VARCHAR2(10 BYTE),
id1 IN NUMBER(7,0),
id2 IN VARCHAR2(8 BYTE),
curr IN VARCHAR2(4 BYTE),
ed IN DATE,
return_status OUT NUMBER
error_code OUT VARCHAR2(10 BYTE)
error_msg OUT VARCHAR2,
cost OUT NUMBER(14,5)
)
问 2:
雪上加霜的是,在抛出上述异常 3 次并正常工作一次后,该脚本随后终止并显示以下 MS SQL 错误消息:
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
即使我排除了导致原始错误的第 3 个调用并且只成功调用了一次 SP,它也会死掉。
如评论中所述,这两个错误都是由声明
@error_msg varchar
它应该在哪里引起的,@error_msg varchar(max)