2013-02-19 25 views
6

Tôi đang cố truy cập thủ tục được lưu trữ trên Oracle 11g thông qua khung thực thể. Tôi có thể truy cập các thủ tục lưu sẵn, trả về vô hướng và trả về giá trị đúng. Nhưng khi sử dụng SYS_REFCURSOR để trả về tập kết quả, tham số OUT không được phát hiện khi nhập hàm.Bản đồ không thể SYS_REFCURSOR trong khung thực thể

thủ tục lưu trữ của tôi là như sau

create or replace PROCEDURE "GetAllClientNames" (
    "ID" IN NUMBER, 
    "SAL" IN NUMBER, 
    "EMP_CURSOR" OUT SYS_REFCURSOR) IS 

BEGIN 


    OPEN EMP_CURSOR FOR SELECT FIRSTNAME FROM CLIENTS; 

END; 

Nhưng khi cập nhật các tổ chức và thực hiện việc nhập khẩu chức năng, tham số SYS_REFCURSOR OUT không được phát hiện trong chức năng nhập khẩu để lấy tập kết quả.

This is the image of imported function

hãy giúp tôi ra về this.Without nhận OUT thông số tôi không thể truy cập các tập kết quả lấy ra bởi thủ tục lưu trữ

+0

Quy trình 'nhập' quy trình được lưu trữ của bạn là gì? –

+1

@TomHalladay Thủ tục lưu sẵn phải được nhập dưới dạng hàm để có thể gọi từ Khuôn khổ thực thể. –

Trả lời

3

Bây giờ data provider oracle cho phép loại hoạt động mà không có nhiều hustle.Its quá phức tạp để trả lời ở đây. Đọc nhanh được thêm vào. Vui lòng theo liên kết bên dưới để biết thông tin chi tiết.

ODP.NET 11g Release 2 (11.2.0.3.0), và cao hơn, cho phép các ứng dụng để chạy các thủ tục lưu trữ với các thông số REF CURSOR mà không sử dụng rõ ràng bắt buộc đối với các thông số trong các mã NET.

Đối với tập hợp kết quả chỉ đọc, chẳng hạn như REF CURSOR sử dụng OracleDataReader, thông tin lược đồ REF CURSOR được truy xuất tự động. Đối với một số kịch bản, chẳng hạn như khi sử dụng khung REF CURSORs hoặc Entity , các nhà phát triển cần phải xác định lược đồ REF CURSOR để ứng dụng có thể ràng buộc REF CURSOR ngầm định. Ứng dụng khung thực thể sử dụng ngầm định REF CURSOR ràng buộc để khởi tạo các loại phức tạp từ dữ liệu REF CURSOR. Ứng dụng phải chỉ định thông tin liên kết và siêu dữ liệu REF CURSOR trong tệp app.config, web.config hoặc tệp machine.config .NET.

Các thuộc tính được cung cấp trong tệp cấu hình .NET cũng được sử dụng khi ứng dụng yêu cầu thông tin lược đồ từ đối tượng Oracle2D1R1 đại diện cho REF CURSOR. Điều này có nghĩa là cho REF CURSOR được tạo bằng cách sử dụng lệnh SELECT từ một bảng, ứng dụng có thể cập nhật bảng đó thông qua việc sử dụng OracleDataAdapter và OracleCommandBuilder.

Khi sử dụng Khuôn khổ thực thể, nhập khẩu chức năng có thể trả lại REF CURSOR bị ràng buộc hoàn toàn. REF CURSOR có thể được trả lại dưới dạng bộ sưu tập của các loại phức tạp hoặc loại thực thể. Để trả về bộ sưu tập kiểu phức tạp , tệp cấu hình .NET cần xác định thông tin liên kết và siêu dữ liệu REF CURSOR . Để trả về một bộ sưu tập kiểu thực thể, chỉ thông tin liên kết cần được xác định trong tệp cấu hình .NET .

Tìm thông tin đầy đủ here

2

Tôi đã có một vấn đề tương tự.

Sau một nghiên cứu dài, tôi phát hiện ra rằng hỗ trợ Oracle cho khung thực thể chưa được phát triển để sử dụng các kiểu dữ liệu phức tạp như kiểu trả về từ thủ tục lưu sẵn. Nó có thể được thực hiện; nhưng nó giống như cái mũi cảm động xung quanh đầu bạn. Vì vậy, nếu bạn đang sử dụng EF một cách dễ dàng thì tốt hơn nên tránh nó và sử dụng các thủ tục được lưu trữ trực tiếp thay thế.

Cuối cùng, tôi quyết định đi cùng EF để tạo, cập nhật và xóa (vì tôi phải triển khai đường kiểm tra) và thủ tục lưu trữ để trả về tập kết quả.

+0

Xin chào - Vậy làm cách nào bạn gọi SP từ EF? Như thế này: var result = db.Database.SqlQuery ("gọi OWI_ADMIN.S_LANDEN()"); ?? –

2

Tôi không nghĩ rằng đi theo cách với khung Entity là một cách tốt nếu bạn muốn thực thi các thủ tục và hàm được lưu trữ với các kiểu trả về phức tạp và các trường nhị phân.

+3

Cảm ơn bạn đã trả lời. Để tiếp tục giúp đỡ người hỏi, nó sẽ hữu ích không chỉ để bình luận về những gì là thực hành xấu, mà còn về những gì sẽ là một cách xây dựng phía trước. Điều gì sẽ là một cách tốt hay tốt hơn trong trường hợp này? – Bex

3

Một loại phức tạp như con trỏ ref có thể được trả về từ quy trình được lưu trữ của Oracle bằng cách sử dụng Entity Framework; nó chỉ đòi hỏi một chút cấu hình bổ sung. Bạn phải thêm đúng XML vào tệp cấu hình để xác định refcursor được trả về và kiểu dữ liệu của các cột.

Ví dụ:

<oracle.dataaccess.client> 
<settings> 
    <add name="schema.storedproc.RefCursor.ref_cursor_param_name" value="implicitRefCursor bindinfo='mode=Output'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.0" value="implicitRefCursor metadata='ColumnName=<column_name_here>;BaseColumnName=<column_name_here>;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.1" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Date;ProviderType=Date'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.2" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Number;ProviderType=Int32'" /> 
</settings> 
</oracle.dataaccess.client> 

Chỉ cần thay thế schema.storedproc giá trị với bạn. Chẳng hạn như ACCOUNTING.GET_EMPLOYEES. Và thay thế column_name_here bằng cột của bạn. Chẳng hạn như EMP_ID. Loại bỏ các dấu ngoặc nhọn quá.

Dưới đây là một bài viết đầy đủ để tham khảo: http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

Tài liệu về mục XML: http://docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319

+0

Bạn không còn phải tạo tệp Config đó bằng siêu dữ liệu bằng tay, cũng như bạn sẽ không bao giờ muốn. Trình thủ thuật "Run Stored Procedure" thực hiện nó cho bạn. Liên kết cho "bài viết" rất lỗi thời.Sử dụng cái này thay vì https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24 Xem câu trả lời của tôi ở nơi khác trên trang này. –

3

Để sử dụng chức năng nhập với EF bạn cần phải làm như sau:

1) OUT SYS_REFCURSOR đầu tiên gặp phải trong danh sách tham số của bạn sẽ trở thành đầu ra của Entity Chức năng. Vì vậy, bạn có thể cần phải bọc SP hoặc chức năng của bạn với một SP mới có chứa OUT SYS_REFCURSOR

2) Bạn cần thiết lập một số siêu dữ liệu về con trỏ này bên trong app.config hoặc web.config của bạn. Điều này được tự động bởi hộp thoại Run Stored Procedure trong Server Explorer.

Bạn có thể xem từng bước hương này ở đây: https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24

Đối với tài liệu thêm về chủ đề này, xem phần Entity Framework của các công cụ phát triển Oracle cho Visual Studio Trợ giúp trực tuyến.

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