2012-07-16 32 views
6

Xin chào, tôi gặp sự cố khi gọi thủ tục lưu trữ trên máy chủ Oracle 11g.ORA-06550: dòng 1, cột 7: PLS-00306: số sai hoặc loại đối số

đây là thủ tục lưu trữ của tôi

PROCEDURE get_rit_by_user_id(KDC_KEY  IN VARCHAR2, 
          p_id_utente IN NUMBER, 
          p_cur_out OUT type_cursor) IS 
    BEGIN 
    ... 
    ... 
    ... 
    END 

này là C# mã của tôi

OracleCommand cmd = new OracleCommand(); 
cmd.Connection = oracleConnection; 
cmd.CommandText = userIdEsercizio + packageName + "GET_RIT_BY_USER_ID"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2, kdcKey, ParameterDirection.Input); 
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32, user_id, ParameterDirection.Input); 
cmd.Parameters.Add("P_CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output); 

OracleDataReader reader = cmd.ExecuteReader(); 

cmd.ExecuteReader() ném ngoại lệ này

ORA-06550: line 1, column 7: 
PLS-00306: wrong number or types of arguments in call to 'GET_RIT_BY_USER_ID' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

Tôi không thể nhìn thấy bất cứ điều gì sai trong mã C# của tôi. Bạn sẽ giúp tôi chứ? nhờ

Trân trọng

+1

Tôi bỏ lỡ biến p_id_utente trong danh sách các tham số (bạn có P_USER). Hai người còn lại ở đó. – Independent

+0

đây không phải là vấn đề, tôi đã kiểm tra tất cả các tên của các tham số –

+0

Bạn đã xem câu hỏi SO này: http://stackoverflow.com/questions/6360244/how-to-call-an-oracle-function- với tham số-a-ref-cursor-as-out-tham số-từ-c – DCookie

Trả lời

5

Vấn đề phổ biến nhất với các thông số đầu vào là null. Nếu kfcKey hoặc user_idnull (tham chiếu null hoặc Nullable<T> không có giá trị), thì đối với nhiều nhà cung cấp (và do đó tôi cũng giả định Oracle), sẽ không thêm thông số. Để vượt qua số null, bạn thường cần phải vượt qua DBNull.Value để thay thế.

Vì vậy: hãy kiểm tra null s.

cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2, 
    (object)kdcKey ?? DBNull.Value, ParameterDirection.Input); 
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32, 
    (object)user_id ?? DBNull.Value, ParameterDirection.Input); 
+0

. Tôi xác minh rằng các giá trị không phải là null, nhưng lỗi vẫn còn. –

+0

Để xác nhận giả định của Marc ở trên, sửa chữa này đã làm việc cho 'System.Data.OracleClient.OracleParameter' cho tôi – jlb83

6

Tham số thứ hai của bạn là NUMBER, không phải là số nguyên. Thay đổi kiểu tham số thứ hai để OracleDbType.Decimal

http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

Ngoài ra kiểm tra cú pháp của Add phương pháp của bạn. Nó có thể là tốt hơn bây giờ để xác định các tính chất tham số một cách rõ ràng hơn, thậm chí nếu nó làm cho mã một chút dài dòng hơn:

cmd.Parameters.Add(
    new OracleParameter() 
     { 
      ParameterName="KDC_KEY", 
      DbType=OracleDbType.Varchar2, 
      Value=kdcKey, 
      Direction=ParameterDirection.Input 
     } 
    ); 

, vv

Sản phẩm proc trở về Kết quả là thiết lập ngoài con trỏ? Nếu không sử dụng ExecuteNonQuery thay vì Execute

+0

Tôi đã cố gắng thay đổi thành Thập phân, nhưng lỗi luôn giống nhau ... –

+0

' type_cursor' là gì? Đó có phải là bí danh cho REF CURSOR không? –

2

Kiểm tra chính tả thông số của bạn, nó phải khớp với tên biến Thủ tục lưu trữ, đặc biệt, nếu bạn có biến đầu ra. Tôi chỉ mất vài giờ xử lý sự cố một vấn đề tương tự, hóa ra tôi đã sai chính tả tên tham số đầu ra của mình.

0

Bạn có một loại loại người dùng được định nghĩa nào đó được gọi là "type_cursor" nhưng đang ràng buộc tham số SYS_REFCURSOR. Đó là nguyên nhân của lỗi này.

0

Tôi đã trải qua vấn đề tương tự và thấy nguyên nhân gốc rễ ngớ ngẩn. Nếu vấn đề của bạn là tương tự, điều này có thể giúp bạn.

Trong trường hợp của chúng tôi, thông báo lỗi chính xác đang được trả lại từ cuộc gọi thủ tục của gói. Sau 10 lần xác nhận mã Java, các tham số của nó và phần cuối của gói "Body" và quy trình của nó, chúng tôi không thể tìm ra bất kỳ sự khác biệt nào.

Sau đó, chúng tôi nhận thấy rằng gói đó có quy trình tương tự với số lượng thông số khác nhau. Và "bắt" ở đây là gói không được biên dịch với phương thức mới đang được gọi từ giao diện người dùng.Vì vậy, nó sẽ là thủ tục cũ.

Vui lòng kiểm tra xem trường hợp này có giống với trường hợp của bạn hay không.

Các vấn đề liên quan