सबसे पहले, OleDb
. का उपयोग न करें , अवधि। Microsoft आपको विक्रेता-विशिष्ट प्रदाता का उपयोग करने के लिए कहता है। Oracle के ODP.NET का उपयोग करें।
दूसरा, Oracle SP से रिकॉर्डसेट प्राप्त करने के लिए, आपको refCursor
. लौटाना होगा .
संपादित करें: इस समय हम जानते हैं कि आपके पैरामीटर टेबल हैं। इसे संसाधित करने के लिए आपको p.CollectionType = OracleCollectionType.PLSQLAssociativeArray
जोड़ना होगा आपके मापदंडों के लिए
आपका कोड अनिवार्य रूप से यह है:
Declare
obus_grp_id PKG_HOBS.Tnumber; -- numeric table value
ostat_c PKG_HOBS.Tnumber; -- numeric table value
ostat_msg_x PKG_HOBS.Tmsg_500; -- string table value
BEGIN
PKG_HOBS.PRC_HOBS_GET_CLIENTID(obus_grp_id, ostat_c, ostat_msg_x);
END;
मैं देख रहा हूँ कि आप अनाम ब्लॉक को क्रियान्वित कर रहे हैं - आपको ऐसा करने की आवश्यकता नहीं है क्योंकि यह आपके लिए चीजों को जटिल बनाता है। आपको सीधे पैकेज को निष्पादित करने के लिए vb.net का उपयोग करने की आवश्यकता है।
<ब्लॉकक्वॉट>नीचे की पंक्ति: आपका वर्तमान ORACLE कोड .NET के परिणामों को आउटपुट करने के लिए कुछ नहीं करता है। अनाम ब्लॉक निकालें और आप व्यवसाय में हैं।
आपकी प्रक्रिया के प्रकार को संसाधित करने के लिए कोड यहां दिया गया है (टिप्पणियों में पढ़ें)
Dim cmd As New OracleCommand("PKG_HOBS.PRC_HOBS_GET_CLIENTID", conn)
cmd.CommandType = CommandType.StoredProcedure
Dim p1 As New OracleParameter(":p1", OracleDbType.Int64, ParameterDirection.Output)
p1.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p1.Size = 100 ' Declare more than you expect
' This line below is not needed for numeric types (date too???)
' p1.ArrayBindSize = New Integer(99) {}
cmd.Parameters.Add(p1)
' Add parameter 2 here - same as 1
Dim p3 As New OracleParameter(":p3", OracleDbType.Varchar2, ParameterDirection.Output)
p3.CollectionType = OracleCollectionType.PLSQLAssociativeArray
p3.Size = 100 ' Declare more than you expect
' for string data types you need to allocate space for each element
p3.ArrayBindSize = Enumerable.Repeat(500, 100).ToArray() ' get 100 elements of 500 - size of returning string
' I don't know why you have problems referencing System.Linq but if you do...
'Dim intA() As Integer = New Integer(99) {}
'For i as integer = 0 to intA.Length -1
' intA(i) = 500
'Next
cmd.Parameters.Add(p3)
conn.Open()
cmd.ExecuteNonQuery()
' Ora number is not compatible to .net types. for example integer is something
' between number(9) and (10). So, if number(10) is the type - you get Long in
' return. Therefore use "Convert"
' Also, you return arrays, so you need to process them as arrays - NOTE CHANGES
Dim oraNumbers() As OracleDecimal = CType(p1.Value, OracleDecimal())
Dim myP1Values(oraNumbers.Length - 1) As Long
For i as Integer = 0 To oraNumbers.Length - 1
myP1Values(i) = Convert.ToInt64(oraNumbers(i).Value)
Next
oraNumbers = CType(p2.Value, OracleDecimal())
Dim myP2Values(oraNumbers.Length - 1) As Long
For i as Integer = 0 To oraNumbers.Length - 1
myP2Values(i) = Convert.ToInt64(oraNumbers(i).Value)
Next
Dim oraStrings() As OracleString= CType(p3.Value, OracleString())
Dim myP3Values(oraStrings.Length - 1) As String
For i as Integer = 0 To oraStrings.Length - 1
myP3Values(i) = oraStrings(i).Value
Next
और यह सबसे महत्वपूर्ण हिस्सा है
सबसे महत्वपूर्ण हिस्सा यह है कि आप अपने घोषित प्रकार को कैसे भरते हैं। आइए लेते हैं
TYPE Tnumber IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
v_num Tnumber;
v_num(1) := 1234567890;
v_num(2) := 2345678901;
v_num(3) := 3456789012;
यह (ऊपर) काम करेगा। लेकिन यह विफल हो जाएगा:
v_num(0) := 1234567890;
v_num(1) := 2345678901;
v_num(2) := 3456789012;
और अंत में, यह एक शर्त के साथ काम करेगा
v_num(2) := 1234567890;
v_num(3) := 2345678901;
v_num(4) := 3456789012;
यहां हमें p1.Value
. में 4 सदस्य मिलेंगे लेकिन अनुक्रमणिका के अंतर्गत 0
आपके पास oracle null
होगा . तो, आपको इससे यहां निपटना होगा (यदि आपकी ऐसी स्थिति है)
' instead of this
myP2Values(i) = Convert.ToInt64(oraNumbers(i).Value)
' you will need first to check
If oraNumbers(i).IsNull Then
. . . .
तो, यहां मुख्य बात यह है कि आपकी pl/sql तालिका का सूचकांक क्या है?! इसे 0
. से बड़े किसी चीज़ से प्रारंभ करने की आवश्यकता है , और अधिमानतः 1
. से . और अगर आपके पास छोड़े गए नंबरों के साथ इंडेक्स है, यानी 2,4,6,8
, वे सभी रिक्त स्थान ऑरैकल सरणी लौटने का हिस्सा होंगे और oracle null
. होगा उनमें
यहां कुछ संदर्भ दिया गया है