[英]Oracle ODP.NET problems calling package procedure with parameters
問題:嘗試調用打包的存儲過程,但調用失敗,具體取決於參數的值。
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}
答案是Oracle 9.2.0.6.0中存在一個導致間歇性VARCHAR2綁定錯誤的錯誤。 真棒。
這種行為是一致的還是間歇性的? 如果間歇,並且您的數據庫是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
幸運的是我們的生產服務器是10g,所以我們最終將我們的開發服務器更新到10g,而中提琴,沒有更多的問題。
回答路徑:
這可能聽起來很奇怪,但要確保oracle參數在查詢中出現時添加。 我過去曾經遇到過這個問題幾次(通常是遷移到ODP.NET)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.