sql >> Database >  >> RDS >> Oracle

Oracle-procedure retourneert geen resultaten bij het uitvoeren van een scripttaak op SSIS

Gebruik ten eerste geen OleDb , punt uit. Microsoft vertelt u dat u een leverancierspecifieke provider moet gebruiken. Gebruik ODP.NET van Oracle.

Ten tweede, om de recordset van Oracle SP op te halen, moet u refCursor . retourneren .

Bewerken: Op dit moment weten we dat uw parameters tabellen zijn. Om dit te verwerken moet u p.CollectionType = OracleCollectionType.PLSQLAssociativeArray toevoegen naar uw parameters

Uw code is in wezen deze:

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;

Ik zie dat u een anonieme blokkering uitvoert - u hoeft dit niet te doen omdat dit de zaken voor u compliceert. Wat je moet doen is vb.net gebruiken om het pakket rechtstreeks uit te voeren.

Kortom: uw huidige ORACLE-code doet niets om resultaten naar .NET te sturen. Verwijder anonieme blokkering en u bent in zaken.

Hier is de code om uw type procedure te verwerken (lees in opmerkingen)

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

En dit is het belangrijkste onderdeel

Het belangrijkste is hoe u uw gedeclareerde type invult. Laten we nemen

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;

Dit (hierboven) zal werken. Maar dit zal mislukken:

v_num(0) := 1234567890;
v_num(1) := 2345678901;
v_num(2) := 3456789012;

En tot slot, dit werkt met één voorwaarde

v_num(2) := 1234567890;
v_num(3) := 2345678901;
v_num(4) := 3456789012;

Hier krijgen we 4 leden in p1.Value maar onder index 0 je hebt oracle null . Dus je zou het hier moeten afhandelen (als je een dergelijke aandoening hebt)

' instead of this 
myP2Values(i) = Convert.ToInt64(oraNumbers(i).Value)
' you will need first to check 
If oraNumbers(i).IsNull Then 
. . . . 

Dus het belangrijkste hier is, WAT is de index van je pl/sql-tabel?! Het moet beginnen met iets groter dan 0 , en bij voorkeur van 1 . En als u een index heeft met overgeslagen nummers, bijv. 2,4,6,8 , al die spaties zullen deel uitmaken van de terugkerende oracle-array en er zal oracle null zijn erin

Hier is wat referentie




  1. split trefwoorden voor post php mysql

  2. Moet ik een tabel ontwerpen met een primaire sleutel van varchar of int?

  3. Help bij MySQL-updatecase

  4. Hoe op te lossen Het probleem met de authenticatie-plug-in 'caching_sha2_password' kan niet worden geladen