Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Procedura Oracle nie zwraca wyników podczas wykonywania zadania skryptu na SSIS

Przede wszystkim nie używaj OleDb , Kropka. Firma Microsoft zaleca korzystanie z dostawcy określonego przez dostawcę. Użyj ODP.NET firmy Oracle.

Po drugie, aby pobrać zestaw rekordów z Oracle SP, musisz zwrócić refCursor .

Edytuj: W tej chwili wiemy, że Twoje parametry to tabele. Aby to przetworzyć, musisz dodać p.CollectionType = OracleCollectionType.PLSQLAssociativeArray do swoich parametrów

Twój kod jest zasadniczo taki:

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;

Widzę, jak wykonujesz anonimową blokadę - nie musisz tego robić, ponieważ to ci komplikuje. To, co musisz zrobić, to użyć vb.net do prostego wykonania pakietu.

Dolna linia: Twój obecny kod ORACLE nie ma żadnego wpływu na wyprowadzanie wyników do platformy .NET. Usuń anonimową blokadę i jesteś w biznesie.

Oto kod do przetwarzania Twojego rodzaju procedury (przeczytaj w komentarzach)

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

I to jest Najważniejsza część

Najważniejszą częścią jest to, jak wypełniasz zadeklarowany typ. Weźmy

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;

To (powyżej) zadziała. Ale to się nie powiedzie:

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

I wreszcie, to zadziała pod jednym warunkiem

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

Tutaj otrzymamy 4 członków w p1.Value ale pod indeksem 0 będziesz miał oracle null . Więc musiałbyś sobie z tym poradzić tutaj (jeśli masz taki stan)

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

Więc najważniejsze jest to, JAKI jest indeks twojej tabeli pl/sql?! Musi zaczynać się od czegoś większego niż 0 , a najlepiej od 1 . A jeśli masz indeks z pominiętymi liczbami, np. 2,4,6,8 , wszystkie te spacje będą częścią zwracającej tablicy oracle i będzie oracle null w nich

Oto kilka referencji




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja pozwalająca na uzyskanie liczby dni tygodnia pomiędzy dwiema datami z wyłączeniem świąt

  2. ScaleGrid dodaje Oracle Cloud do hostingu zarządzanej bazy danych

  3. Zapytanie o wyszukanie wszystkich pakietów w tabeli i/lub kolumnie

  4. customer.pk_name dołączanie do transakcji.fk_name vs. customer.pk_id [serial] dołączanie do transakcji.fk_id [liczba całkowita]

  5. Siatki bezpieczeństwa