2014-05-21 24 views
4
CREATE OR REPLACE PACKAGE johns_test_pkg AS 

    PROCEDURE test(some_parameter IN NUMBER, 
       success_id  OUT NUMBER); 

    PROCEDURE test_no_out_parameter(some_parameter IN NUMBER); 

    PROCEDURE test_no_in_parameter(success_id OUT NUMBER); 

END johns_test_pkg; 
/

CREATE OR REPLACE PACKAGE BODY johns_test_pkg AS 

    -- 
    PROCEDURE test(some_parameter IN NUMBER, 
       success_id  OUT NUMBER) 
    IS 
    v_app_user_session_id INTEGER; 
    BEGIN 
     v_app_user_session_id := 1 + some_parameter; 

     success_id := v_app_user_session_id; 
    END; 

    -- 
    PROCEDURE test_no_out_parameter(some_parameter IN NUMBER) 
    IS 
    v_app_user_session_id INTEGER; 
    BEGIN 
     v_app_user_session_id := 1 + some_parameter; 
    END; 

    -- 
    PROCEDURE test_no_in_parameter(success_id OUT NUMBER) 
    IS  
    v_app_user_session_id INTEGER; 
    BEGIN 
     v_app_user_session_id := 1 + 10; 
     success_id := v_app_user_session_id; 
    END; 

END johns_test_pkg; 
/

鑑於以上簡單的Oracle包內有三個程序。我試圖使用實體框架5將這些程序添加到我的模型中,但無濟於事。我已經能夠添加一些不在包中的幾個Oracle過程。使用Entity Framework從oracle包導入程序5

我一直在閱讀關於這個和其他一些問題是相似的how-to-call-oracle-function-with-return-value-using-linq-to-entities並從所選答案繼續閱讀。該人聲明IN OUT參數或OUT參數可以正常工作,但是我的三個參數都沒有導入。我本來預計test_no_in_parameter程序會被加載?

是否可以在程序包下加載程序?

+0

又愛我的問題從來沒有得到回答:( – John

+0

我遇到了同樣的問題,你有沒有解決了這個。任何有識之士將是有益的。 – Kar

+0

@Kar,你有沒有Pat的解決方案? –

回答

10

在edmx模型中,右鍵單擊「從數據庫更新模型」 取消勾選「將選定的存儲過程和函數導入實體模型」,從程序包中選擇程序並進行更新。 (它的工作原理) 然後在「Model.Store \ Stored Procedures/Functions」下的「Model Browser」中,您將看到程序包(最後)。然後將它們映射到「函數導入」中。

我不明白爲什麼取消勾選導入存儲過程的作品,但它確實如此。

+0

你保存了我的頭髮!謝謝! –

+0

僅供參考:EF6.1.3 - 我能夠添加一個SELECT存儲過程,但是它不會添加一個執行UPDATE的包存儲過程 - 就像它一樣添加它,但它沒有。取消選中「導入選定的存儲過程...」終於讓它識別UPDATE包存儲過程並將其添加到模型中。 –

1

如果EF 5在從Oracle包導入過程中遇到麻煩,則有兩種解決方法。

  • 呼叫在一個匿名塊中的任何步驟:

    var param1 = new OracleParameter("p_param_in", OracleDbType.Number, 123, ParameterDirection.Input); 
    var param2 = new OracleParameter("p_param_out", OracleDbType.Number, ParameterDirection.Output); 
    
    var param2_val = db.Database.SqlQuery<YourTestEntity>(
           "BEGIN johns_test_pkg.test(:p_param_in, :p_param_out); END;" 
           , param1).Single(); 
    
  • 在每包所需過程創建的包裝存儲過程。我認爲這是滿足EF並保持代碼健壯性的一種適當方式(不需要簡單快速的匿名塊)。唯一的問題是,考慮到Oracle有30個符號名稱限制,你將爲包裝找到好的命名風格。

    CREATE OR REPLACE my_wrap_prefix__test(some_parameter IN NUMBER, 
                 success_id  OUT NUMBER) 
    IS BEGIN 
        johns_test_pkg.test(some_parameter, success_id); 
    END; 
    
相關問題