Ao chamar uma função Oracle com o seguinte em tipos de parâmetro
NUMBER(7,0)
VARCHAR2(8 BYTE)
VARCHAR2(4 BYTE)
DATE
e tipo de retorno NUMBER(14,5)
do SQL Server 2008R2 por meio de um servidor Oracle vinculado, declarei as variáveis de parâmetro no lado do SQL Server da seguinte maneira:
numeric(7,0) -- also tried INT, BIGINT
varchar(8)
varchar(4)
datetime -- also tried DATE
e retorna o tipo de variávelnumeric(14,5)
exec ( 'BEGIN ? := db.pkg.getPrice(?,?,?,?); END;', @price, @id1, @id2, @curr, @ed ) AT ORASRV
A chamada falha com o seguinte erro:
OLE DB provider "OraOLEDB.Oracle" for linked server "ORASRV" returned message "ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1".
O que estou fazendo errado?
Para testar essa função usei o seguinte script PL/SQL e funcionou bem (impresso 0
que é um resultado correto para os parâmetros):
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;
Também criei uma função apenas para teste:
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;
Quando eu chamo do SQL Server da seguinte maneira
declare @a varchar(1),@b varchar(1) -- also tried INT
select @b = 'a'
exec ( 'BEGIN ? := db.getTest(?); END;', @a, @b) AT ORASRV
Estou tendo o erro a seguir:
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'.
No caso de INTEGER no lado do Oracle e INT no lado do SQL Server, a mensagem é apenas"ORA-06502: PL/SQL: numeric or value error
Seus tipos de dados devem estar corretos, no entanto, você precisa alterar um pouco sua chamada e adicionar OUTPUT após seu @price. Eu testei isso no Oracle11g em INTEGER -> INT, VARCHAR2 -> VARCHAR, DATE -> Datetime usando sua função getTest