我正在执行一个Oracle存储过程,它有三个输出参数,并以表格格式返回结果。我正在使用数组来捕获这些结果。我在这里遇到这个问题。还要善意验证我的东西,它有意义吗?
Dim cmd As New OracleCommand("PKG_HOBS.PRC_HOBS_GET_CLIENTID", FPP1_Connection)
cmd.CommandType = CommandType.StoredProcedure
Dim p1 As New OracleParameter(":obus_grp_id", OracleDbType.Int64, ParameterDirection.Output)
p1.OracleDbType = OracleDbType.Int64
p1.Direction = ParameterDirection.Output
p1.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p1.Size = 100 ' This is the size of items in array in THIS case
p1.ArrayBindSize = New Integer() {100}
cmd.Parameters.Add(p1)
Dim p2 As New OracleParameter(":ostat_c", OracleDbType.Int64, ParameterDirection.Output)
p2.OracleDbType = OracleDbType.Int64
p2.Direction = ParameterDirection.Output
p2.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p2.Size = 100 ' This is the size of items in array in THIS case
p2.ArrayBindSize = New Integer() {100}
cmd.Parameters.Add(p2)
Dim p3 As New OracleParameter(":ostat_msg_x", OracleDbType.Varchar2, 500, ParameterDirection.Output)
p3.OracleDbType = OracleDbType.Varchar2
p3.Direction = ParameterDirection.Output
p3.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p3.Size = 500 ' This is the size of items in array in THIS case
p3.ArrayBindSize = New Integer() {500}
cmd.Parameters.Add(p3)
FPP1_Connection.Open()
cmd.ExecuteNonQuery()
答案 0 :(得分:0)
我找到了这个问题的解决方案。希望它对某些人有所帮助。我们必须使用Enumerable.repeat
作为字符串数据类型。
Dim cmd As New OracleCommand("PKG_HOBS.PRC_HOBS_GET_CLIENTID", FPP1_Connection)
cmd.CommandType = CommandType.StoredProcedure
'Passing three parameters and retriving the results in array
Dim p1 As New OracleParameter("obus_grp_id", OracleDbType.Int64, ParameterDirection.Output)
p1.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p1.Size = 100
cmd.Parameters.Add(p1)
Dim p2 As New OracleParameter("ostat_c", OracleDbType.Int64, ParameterDirection.Output)
p2.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p2.Size = 100
cmd.Parameters.Add(p2)
Dim p3 As New OracleParameter("ostat_msg_x", OracleDbType.Varchar2, ParameterDirection.Output)
p3.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p3.Size = 100
p3.ArrayBindSize = Enumerable.Repeat(500, 100).ToArray
cmd.Parameters.Add(p3)
cmd.ExecuteNonQuery()
Try
'Assigning each parameter values into local variables
Dim oraobus_grp_id() As OracleDecimal = CType(p1.Value, OracleDecimal())
Dim oraostat_c() As OracleDecimal = CType(p2.Value, OracleDecimal())
Dim oraostat_msg_x() As OracleString = CType(p3.Value, OracleString())
Dim obus_grp_idVal(oraobus_grp_id.Length - 1) As Long
Dim ostat_cVal(oraostat_c.Length - 1) As Long
Dim ostat_msg_xVal(oraostat_msg_x.Length - 1) As String
For i As Integer = 0 To oraobus_grp_id.Length - 1
obus_grp_idVal(i) = Convert.ToInt64(oraobus_grp_id(i).ToString)
ostat_cVal(i) = Convert.ToInt64(oraostat_c(i).ToString)
If ostat_cVal(i) <> "0" And ostat_cVal(i) <> "800" Then
If Not oraostat_msg_x(i).IsNull Then
ostat_msg_xVal(i) = Convert.ToString(oraostat_msg_x(i).Value)
Dts.Events.FireError(-1, "", "Error response in new client retrieval: " + ostat_msg_xVal(i), "", 0)
Else
ostat_msg_xVal(i) = Nothing
Dts.Events.FireError(-1, "", "Error response in new client retrieval: " + ostat_msg_xVal(i), "", 0)
End If
Else
Call InsertClient(obus_grp_idVal(i))
End If
Next