Pergunta 1:
Sempre que um Oracle SP deseja retornar código/mensagem de erro, ele falha ao retornar a exceção abaixo:
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".
Estou chamando do MS SQL por meio de um servidor vinculado da seguinte maneira:
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
Parece que os parâmetros de entrada funcionam bem, pois seus valores são tais que quando o SP está retornando um resultado correto, tudo está funcionando. Somente os valores do parâmetro IN podem fazer com que o SP retorne um código de erro, quando o erro acima for lançado.
A declaração do lado do Oracle é a seguinte:
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)
)
Pergunta 2:
Para adicionar insulto à lesão, depois de lançar a exceção acima 3 vezes e funcionar bem uma vez, o script morre com a seguinte mensagem de erro do 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.
Ele morre mesmo se eu excluir as 3 primeiras chamadas que causam o erro original e apenas chamar o SP com sucesso uma vez.
Conforme declarado nos comentários, ambos os erros foram causados ao declarar
@error_msg varchar
onde deveria estar,@error_msg varchar(max)