sql >> Databáze >  >> RDS >> Oracle

Procedura Oracle nevrací výsledky při provádění úlohy skriptu na SSIS

Za prvé, nepoužívejte OleDb , doba. Společnost Microsoft vám říká, abyste použili poskytovatele specifického pro dodavatele. Použijte ODP.NET společnosti Oracle.

Za druhé, pro načtení sady záznamů z Oracle SP musíte vrátit refCursor .

Upravit: V tuto chvíli víme, že vaše parametry jsou tabulky. Chcete-li to zpracovat, musíte přidat p.CollectionType = OracleCollectionType.PLSQLAssociativeArray na vaše parametry

Váš kód je v podstatě tento:

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;

Vidím, že provádíte anonymní blokování – nemusíte to dělat, protože vám to komplikuje věci. Co musíte udělat, je použít vb.net ke spuštění balíčku přímo.

Sečteno a podtrženo: váš aktuální kód ORACLE nedělá nic pro výstup výsledků do .NET. Odstraňte anonymní blok a můžete začít.

Zde je kód pro zpracování vašeho typu postupu (přečtěte si v komentářích)

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

A to je nejdůležitější část

Nejdůležitější částí je, jak vyplníte deklarovaný typ. Vezměme

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;

Toto (výše) bude fungovat. Ale to selže:

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

A nakonec to bude fungovat s jednou podmínkou

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

Zde získáme 4 členy v p1.Value ale pod indexem 0 budete mít oracle null . Takže byste to museli řešit zde (pokud máte takový stav)

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

Takže hlavní věc je, JAKÝ je index vaší tabulky pl/sql?! Musí začínat něčím větším než 0 a nejlépe od 1 . A pokud máte index s vynechanými čísly, tj. 2,4,6,8 , všechny tyto mezery budou součástí vracejícího se pole Oracle a bude zde oracle null v nich

Zde je několik odkazů




  1. PHP vkládání více polí zaškrtávacích polí A textových polí do databáze MySQL

  2. Řetězec k datu v Oracle s milisekundami

  3. Jak používat tabulky Oracle PLSQL (asociativní pole nebo index podle tabulky)

  4. Jak mohu exportovat schéma databáze v PostgreSQL?