2015-07-03 16 views
7

Tôi có một thủ tục lưu trữ oracle mà mất 2 dây và một ngày trong parametter đầu vào và trong đó cung cấp cho một con trỏ ref như đầu ra:Gọi oracle Stored Procedure với EF thất bại

CREATE OR REPLACE PROCEDURE SCHEMA.MYPROSTO (
    pPl IN  VARCHAR2, -- Comma (;) separated 
    pTy IN  VARCHAR2,-- Comma (;) separated 
    pDate  IN  mytable.mydate%TYPE, 
    pCursor  OUT sys_refcursor) 
IS 
    ..... 
    sSQL  VARCHAR2 (3000); 
BEGIN 

    -- making SQL Order 
    sSQL := 'SELECT TO_CHAR (v.date_c........ 

    ...... 


    OPEN pCursor FOR sSQL; 

END MYPROSTO; 

Con trỏ đầu ra trả về một tập của 3 chuỗi ô hàng.

tôi nhập khẩu thủ tục lưu trữ này trong mô hình khuôn khổ thực thể của tôi, với điều này trong file .config:

<oracle.manageddataaccess.client> 
<version number="*"> 
    <implicitRefCursor> 
    <storedProcedure schema="SCHEMA" name="MYPROSTO"> 
     <refCursor name="PCURSOR"> 
     <bindInfo mode="Output"/> 
     <metadata columnOrdinal="0" columnName="YEAR" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     <metadata columnOrdinal="1" columnName="MONTH" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     <metadata columnOrdinal="2" columnName="COUNT" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     </refCursor> 
    </storedProcedure> 
    </implicitRefCursor> 
</version> 
</oracle.manageddataaccess.client> 

Các Wizzard chức năng nhập khẩu tạo ra một đối tượng kết quả và tạo ra một chức năng truy cập:

public virtual ObjectResult<MYPROSTO_Result> MYPROSTO (string pPL, string pTY, Nullable<System.DateTime> pDATE) 
{ 
    var pPLParameter = pPL!= null ? 
     new ObjectParameter("PPL", pPL) : 
     new ObjectParameter("PPL", typeof(string)); 

    var pTYParameter = pTY!= null ? 
     new ObjectParameter("PTY", pTY) : 
     new ObjectParameter("PTY", typeof(string)); 

    var pDATEParameter = pDATE.HasValue ? 
     new ObjectParameter("PDATE", pDATE) : 
     new ObjectParameter("PDATE", typeof(System.DateTime)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<MYPROSTO_Result>("MYPROSTO", pPLParameter, pTYParameter, pDATEParameter); 
} 

Tuy nhiên, cuộc gọi đến chức năng này làm tăng ngoại lệ (System.Data.Entity.Core.EntityCommandExecutionException) trên dòng cuối cùng:

ORA-06550: Ligne 1, colonne 8 : PLS-00306: wrong number or types of arguments in call to 'MYPROSTO' 
ORA-06550: Ligne 1, colonne 8 : PL/SQL: Statement ignored 

Tôi không thấy lý do tại sao nó không

+0

Được rồi pDate được ánh xạ tới VARCHAR2? – bubi

+0

Ý bạn là gì? Bạn có đề nghị tôi cố gắng vượt qua một varchar thay vì một ngày trong thủ tục lưu trữ của tôi? –

+0

Bạn đã thử xem http://docs.oracle.com/cd/E51173_01/win.122/e17732/featImplRefCursor.htm#ODPNT321 chưa? Ngoài ra, hãy thử thay đổi 'Varchar2' thành' varchar2' trong kiểu dữ liệu gốc (chỉ cần làm theo hướng dẫn ở đây, đó là Oracle, bạn không bao giờ biết). – flindeberg

Trả lời

3

Có vẻ như một số vấn đề:

  • Gửi một varchar (2) vào một trường ngày
  • Tên của một tham số "Pty "so với "pType"
  • tên của một tham số "ppl" so với "pPlant"
  • tên của một tham số "PPLT" so với "pPL"
+0

Đó là lỗi trong quá trình hợp nhất của tôi, xem chỉnh sửa của tôi –

+0

Điều đó có thể giải thích 2 trong số các điểm nêu trên nhưng không phải tất cả 4 –

+0

Cố định cho lỗi chính tả cuối cùng. Tuy nhiên, nơi nào bạn nhìn thấy một varchar2 vào một ngày? –

0

Còn về tham số trả về. Nó được "ánh xạ" ok? Doublecheck

0

Chắc chắn câu trả lời là rõ ràng trong thông báo lỗi:

"nhầm số hoặc loại lập luận trong lời kêu gọi 'MYPROSTO"

thủ tục của bạn hy vọng 4 thông số mà bạn chỉ qua 3. Bạn cần một biến đầu ra cho refcursor.

0

Tôi đã có cùng một điều xảy ra với tôi và cuối cùng đã giải quyết nó. Tôi đã sử dụng oracle.manageddataaccess.client, giống như bạn, và có giải pháp .NET của tôi được chia thành một Dự án Trình bày, Dự án WebAPI và Dự án Truy cập Dữ liệu. App.config của tôi trong Dự án Truy cập Dữ liệu có phần ImplicitRefCursor chính xác với định nghĩa con trỏ và siêu dữ liệu giống như bạn có, nhưng tôi cũng quên sao chép nó vào web.config của dự án WebAPI của tôi. Khi tôi đã làm điều đó, lỗi "số sai hoặc loại đối số" của tôi biến mất. Hy vọng rằng sẽ giúp. (Tôi vừa sao chép toàn bộ phần oracle.manageddataaccess.client.)

Ngoài ra, nếu bạn đã tạo toàn bộ phần ImplicitRefCursor đó, tôi đã khám phá ra cách dễ dàng và đáng tin cậy hơn để thực hiện điều đó. Từ .NET Server Explorer, kết nối với cơ sở dữ liệu của bạn, tìm thủ tục lưu sẵn của bạn, nhấn chuột phải vào nó và RUN. Rồi OK. Nó sẽ đưa ra một danh sách các tham số IN và OUT, bao gồm cả con trỏ. Nếu bạn bấm vào nút Hiển thị cấu hình, nó sẽ cho bạn thấy những gì cần phải có trong ứng dụng EF.config của bạn. Và nút AddConfig sẽ thêm nó cho bạn. Điều đó giúp tránh những sai lầm.

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