2013-02-14 1 views
4

Задача: Попытка вызова упакованной хранимой процедуры, но вызов прерывается в зависимости от значений параметров.Проблемы Oracle ODP.NET, вызывающие процедуру пакета с параметрами

ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at line 1 

Процедура Определение: Создание

procedure DUP_EXACT (
    SSN in VARCHAR2, 
    LASTNAME in VARCHAR2, 
    FIRSTNAME in VARCHAR2, 
    MASTERRECORD IN VARCHAR2 DEFAULT NULL, 
    C_Table out sp_cursor) 

Параметр:

For Each SearchParameter In SearchParameters 
     ValueParameter = New OracleParameter 

     ValueParameter.Direction = ParameterDirection.Input 
     ValueParameter.OracleDbType = OracleDbType.Varchar2 
     ValueParameter.ParameterName = SearchParameter.ParameterFieldName 

     If Not SearchParameter.TransformedFieldValue = Nothing Then 
      ValueParameter.Value = SearchParameter.TransformedFieldValue 
     Else 
      ValueParameter.Value = String.Empty 
     End If 

     ExactMatchSearchParameters.Add(ValueParameter) 
    Next 

    Dim MasterRecordParameter As New OracleParameter() 

    MasterRecordParameter.Direction = ParameterDirection.Input 
    MasterRecordParameter.OracleDbType = OracleDbType.Varchar2 
    MasterRecordParameter.ParameterName = "MASTERRECORD" 
    MasterRecordParameter.Value = DBNull.Value 

    ExactMatchSearchParameters.Add(MasterRecordParameter) 

    Dim TableParameter As New OracleParameter 

    TableParameter.ParameterName = "C_Table" 
    TableParameter.OracleDbType = OracleDbType.RefCursor 
    TableParameter.Direction = ParameterDirection.Output 

    ExactMatchSearchParameters.Add(TableParameter) 

Исполнение:

Using Command As OracleCommand = 
     New OracleCommand(
      QualifiedProcedureName, 
      Me.Database.Connection) 

    Command.CommandType = CommandType.StoredProcedure 
    'Command.AddToStatementCache = False ' 

    For Each Parameter In Parameters 
     Command.Parameters.Add(Parameter) 
    Next 

    Command.Connection.Open() 

    'Command.Connection.FlushCache() ' 

    Using Reader As OracleDataReader = Command.ExecuteReader() 

Пример Успехов & Неудачи:

*** SUCCESS *** 
[SSN]: "6#######0" 
[LASTNAME]: "W_____x" 
[FIRSTNAME]: "D______e" 
[MASTERRECORD]: "" 
[C_Table]: "" 

*** FAILURE *** 
[SSN]: "2#######_1" 
[LASTNAME]: "C____n" 
[FIRSTNAME]: "L___e" 
[MASTERRECORD]: "" 
[C_Table]: "" 

*** FAILURE *** 
[SSN]: "5#######5" 
[LASTNAME]: "C_______s" 
[FIRSTNAME]: "R_____o" 
[MASTERRECORD]: "" 
[C_Table]: "" 

*** SUCCESS *** 
[SSN]: "6#######0" 
[LASTNAME]: "P___a" 
[FIRSTNAME]: "N______r" 
[MASTERRECORD]: "" 
[C_Table]: "" 

Дополнительное тестирование:

Я попытался запустить трассировку, чтобы увидеть, что ODP.NET фактически посылает в базу данных в параметрах, но tracefiles не предоставили никакой значимой информации (IE: фактические значения параметров)

TIME:2013/02/14-14:10:19:678 
TID:231c 
OpsSqlPrepare2(): 
SQL: Begin PACKAGE.DUP_EXACT(:v0, :v1, :v2, :v3, :v4); End; 

Пример Значения параметров:

?Command.Parameters(0) 
{SSN} 
    ArrayBindSize: Nothing 
    ArrayBindStatus: Nothing 
    CollectionType: None {0} 
    DbType: String {16} 
    Direction: Input {1} 
    InvalidPrecision: 100 
    InvalidScale: 129 
    InvalidSize: -1 
    IsNullable: False 
    m_bOracleDbTypeExSet: False 
    m_bReturnDateTimeOffset: False 
    m_collRef: {Oracle.DataAccess.Client.OracleParameterCollection} 
    m_commandText: "" 
    m_direction: Input {1} 
    m_disposed: False 
    m_enumType: ORADBTYPE {4} 
    m_modified: False 
    m_oraDbType: Varchar2 {126} 
    m_paramName: "SSN" 
    m_paramPosOrName: "" 
    m_saveValue: Nothing 
    MaxScale: 127 
    MinScale: -84 
    Offset: 0 
    OracleDbType: Varchar2 {126} 
    OracleDbTypeEx: Varchar2 {126} 
    ParameterEnumType: ORADBTYPE {4} 
    ParameterName: "SSN" 
    Precision: 0 
    Scale: 0 
    Size: 0 
    SourceColumn: "" 
    SourceColumnNullMapping: False 
    SourceVersion: Current {512} 
    Status: Success {0} 
    UdtTypeName: "" 
    Value: "4#######0" {String} 
+0

Вы пробовали тест, где вы вручную построить свои объекты OracleParameter с жесткими закодированных значений, и добавить их в свой OracleCommand ? ... для решения проблемы с вашим динамическим кодом. –

+0

Это разрешило 1 случай, но другой все еще не работает –

ответ

2

Ответ заключается в том, что в Oracle 9.2.0.6.0 есть ошибка, которая вызывает переплетенные ошибки привязки VARCHAR2. Потрясающие.

This forum post finally gave me the answer:

Является ли это поведение соответствует или прерывистый? Если intermitten и ваш дб 9206, вы, вероятно, встречая следующий RDBMS ошибка:

Bug.4015165 (74) REGRN SCALAR VARCHAR2 В Связывает с различными размерами СЛУЧАЙНО НЕ С ORA-06502

и должны быть решены путем исправления базы данных.

Я не уверен, почему, но ODP, похоже, встречает эту ошибку намного больше, чем других драйверов.

Если это не прерывисто, или если вы используете текущий уровень патча , полная тестовая версия, вероятно, будет лучше.

Приветствия, Грег

Быстрая проверка подтвердили, что версия мы на это влияет:

select * from v$version; 
---------------------------------------------------------------- 
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production  
PL/SQL Release 9.2.0.6.0 - Production        
CORE 9.2.0.6.0 Production           
TNS for 32-bit Windows: Version 9.2.0.6.0 - Production   
NLSRTL Version 9.2.0.6.0 - Production 

К счастью наши производственные серверы 10г, так что мы наконец-то обновили наш Dev сервер в 10г а также, альта, больше никаких проблем.

Ответ Trail:

Parameter issue with Oracle RefCursor

Oracle ODP.NET Forum

ODP.NET Forum Thread "Error ORA-06502 PL/SQL"

1

Это может показаться странным, но убедитесь, что оракул PARAMS добавлены, как они появляются в запросе. Я сталкивался с этой проблемой несколько раз в прошлом (часто при переходе на ODP.NET)

+0

Хорошее напоминание, но я уверен, что они в порядке в запросе, так как код отладки, который печатал сообщения об успешном завершении/сбое, выводил их из цикла for параметров –

+1

По умолчанию используется привязка по положению, но вы можете установить для свойства bindbyname значение true, чтобы помочь в переносе кода с других поставщиков, таких как OracleClient. –

 Смежные вопросы

  • Нет связанных вопросов^_^