Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thủ tục Oracle không trả về kết quả khi thực thi từ tác vụ tập lệnh trên SSIS

Trước hết, không sử dụng OleDb , giai đoạn =Stage. Microsoft yêu cầu bạn sử dụng nhà cung cấp dành riêng cho nhà cung cấp. Sử dụng ODP.NET của Oracle.

Thứ hai, để truy xuất tập bản ghi từ Oracle SP, bạn cần trả về refCursor .

Chỉnh sửa: Tại thời điểm này, chúng tôi biết rằng các tham số của bạn là các bảng. Để xử lý điều này, bạn cần thêm p.CollectionType = OracleCollectionType.PLSQLAssociativeArray tới các thông số của bạn

Mã của bạn về cơ bản là thế này:

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;

Tôi thấy bạn đang thực hiện khối ẩn danh - bạn không cần phải làm điều này vì điều này làm phức tạp mọi thứ cho bạn. Những gì bạn cần làm là sử dụng vb.net để thực thi gói.

Điểm mấu chốt: mã ORACLE hiện tại của bạn không có tác dụng gì để xuất kết quả ra .NET. Xóa khối ẩn danh và bạn đang kinh doanh.

Đây là mã để xử lý loại thủ tục của bạn (đọc trong phần bình luận)

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

Và đây là phần Quan trọng nhất

Phần quan trọng nhất là cách bạn điền vào loại đã khai báo của mình. Hãy lấy

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;

Điều này (ở trên) sẽ hoạt động. Nhưng điều này sẽ không thành công:

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

Và cuối cùng, điều này, sẽ hoạt động với một điều kiện

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

Ở đây chúng ta sẽ có 4 thành viên trong p1.Value nhưng dưới chỉ mục 0 bạn sẽ có oracle null . Vì vậy, bạn sẽ cần phải giải quyết nó ở đây (nếu bạn có điều kiện như vậy)

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

Vì vậy, điều quan trọng ở đây là, chỉ số của bảng pl / sql của bạn là gì ?! Nó cần phải bắt đầu từ một cái gì đó lớn hơn 0 và tốt nhất là từ 1 . Và nếu bạn có chỉ mục với các số bị bỏ qua, tức là 2,4,6,8 , tất cả các khoảng trắng đó sẽ là một phần của việc trả về mảng oracle và sẽ có oracle null trong họ

Đây là một số tài liệu tham khảo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách chèn ngày hiện tại vào trường DATE ở định dạng dd / mm / yyyy trong oracle

  2. Quy trình đăng nhập trong R12.2 và cách khắc phục sự cố cơ bản

  3. Cài đặt các lược đồ mẫu cho Oracle 12c bằng Hỗ trợ cấu hình cơ sở dữ liệu

  4. ORA-06502:PL / SQL:lỗi số hoặc giá trị:bộ đệm chuỗi ký tự quá nhỏ

  5. NLS_CHARSET_DECL_LEN () Hàm trong Oracle