Мы являемся зарегистированными ползователями ODAC 5.10.1.16.
Странный косяк происходит только на Oracle 9.2.0.6: при вызове хранимой процедуры с одним входным параметром типа varchar2 получаем ошибку ORA-06502: PL/SQL: numeric or value error. Происходит это если увеличивать длину передаваемой строки.
Чтение документации и анализ OraClasses.pas выявило следующее:
для входных параметров типа varchar2 происходит повторный вызов OCIAttrSet.
Code: Select all
procedure TOCICommand.BindParam(Param: TOraParamDesc);
...
try
Check(OCIAttrSet(hBind, OCI_HTYPE_BIND, Handle, 0, OCI_ATTR_MAXDATA_SIZE, hOCIError));
finally
FreeOrdinal(Handle);
end;
if (OCIVersion >= 9000) and (FConnection.GetOracleVersion >= 9200) and (Param.ParamType = pdInput) and (Param.FLen > 0) then begin
MaxDataSize := Param.FLen;
Handle := OrdinalToPtr(MaxDataSize);
try
Check(OCIAttrSet(hBind, OCI_HTYPE_BIND, Handle, 0, OCI_ATTR_MAXCHAR_SIZE, hOCIError));
finally
FreeOrdinal(Handle);
end;
end;
...
end;
Oracle Call Interface Programmer's Guide
Release 2 (9.2)
Part Number A96584-01
5
Binding and Defining
Character Conversion Issues in Binding and Defining
Buffer Expansion During Binding
однозначно указано:
Do not set OCI_ATTR_MAXDATA_SIZE for OUT binds or for PL/SQL binds.
Only set OCI_ATTR_MAXDATA_SIZE for INSERT or UPDATE statements.
Oracle запрещает использовать OCI_ATTR_MAXDATA_SIZE при вызове хранимых процедур, что является причиной ошибки.
Непонятным остается одно: почему это происходит только на Oracle 9.2.0.6, на всех остальных версиях 9.2.0.x и на 10g - работает.
Хочется узнать, исправленна ли эта ошибка, и если да, то с какой версии ODAC'а?