2009-11-26 216 views

回答

1

你必須使用最新版本的NHibernate(2.1.2)。

<sql-query name="ReturnSomethig" callable="true"> 
    <return class="Somethig" /> 
    { call ReturnSomethig(:someParameter) } 
</sql-query> 

Oracle存儲過程需要具有第一個參數作爲out sys_refcursor參數。

你可以叫這樣的命名查詢:

IQuery query = currentSession.GetNamedQuery("ReturnSomethig"); 
query.SetInt64("someParameter", someParameter); 
var somethig = query.List<Somethig>(); 

,它會工作。

+0

我不能得到這個工作。當我下載源代碼時,我實際上不得不利用這個帖子進行一些修改(https://forum.hibernate.org/viewtopic.php?f=25&t=999056)。這也是在2.1.2版本中。 – 2010-04-09 16:06:54

+0

當時我們並沒有爲我們的問題使用refcursor,但是,我覺得這將是我的問題的解決方案。因此,接受它。 * *請參考上面布雷克的鏈接。 – publicgk 2011-04-01 14:10:55

0

請參閱this comment理查德布朗。一些示例代碼可以發現here
不幸的是我無法測試它,所以我不知道它是否有效。

1

我嘗試了2.1.2庫,沒有多少運氣。我不得不根據this article對庫進行一些修改。如果你走這條路線,你會想確保你使用的是Oracle.DataAccess DLL,因爲它不會與System.DataAccess.OracleClient DLL一起工作。

0

遲來的回覆。

對於oracle,out參數不受nHibernate支持,除非它是一個遊標。如果你只是想要一個標量值,解決方法是用oracle函數包裝你的存儲過程。

然後你就可以做到這一點

<sql-query name="TestOracleFunction" callable="true"> 
    <return-scalar column="MyOutputValue" type="String" /> 
    <![CDATA[ 
    select MyOracleFunction as MyOutputValue from dual 
    ]]> 
    </sql-query> 

這工作!

0

雖然調查從NHibernate中獲取參數,我發現各種鏈接提示要獲取存儲的proc輸出參數值(而不是使用refcursor),您需要在代碼中構造命令而不是使用XML映射文件。

但我發現很難在網上找到一個完整的工作示例。這不是一個美麗的解決方案,但我發佈以防萬一有人幫助。

  1. 實例的Oracle存儲過程:

    create or replace PACKAGE BODY MY_PACKAGE AS 
    
        PROCEDURE add_one 
        (
        p_out out number, 
        p_in in number 
    ) AS 
        BEGIN 
        select p_in + 1 into p_out from dual; 
        END add_one; 
    
    END MY_PACKAGE; 
    
  2. 實例C#代碼,其中sessionFactory是NHibernate的ISessionFactory

    using (var session = sessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
        var command = session.Connection.CreateCommand(); 
        command.CommandType = CommandType.StoredProcedure; 
        command.CommandText = "MY_PACKAGE.add_one"; 
    
        var parmOut = command.CreateParameter(); 
        parmOut.ParameterName = "p_out"; 
        parmOut.DbType = DbType.Decimal; 
        parmOut.Direction = ParameterDirection.Output; 
        command.Parameters.Add(parmOut); 
    
        var parmIn = command.CreateParameter(); 
        parmIn.ParameterName = "p_in"; 
        parmIn.DbType = DbType.Decimal; 
        parmIn.Direction = ParameterDirection.Input; 
        parmIn.Value = 67; 
        command.Parameters.Add(parmIn); 
    
        transaction.Enlist(command); 
        command.ExecuteNonQuery(); 
    
        int sixtyEight = (int) (decimal) parmOut.Value; 
    } 
    
相關問題