2012-04-30 36 views
1

我在NHibernate的的.hbm.xml映射文件中映射的Oracle 11g存儲過程作爲命令一個Oracle 11g中,像這樣:NHibernate的3.3:<sql-insert>執行存儲過程

<class name="Person" table="PERSONS"> 
    <id name="Id" column="COD_PERSON" /> 
    <property name="Name" column="NAME" /> 

    <property name="AuditField1" column="AUDITFIELD1" /> 
    <property name="AuditField2" column="AUDITFIELD2" /> 
    <property name="AuditField3" column="AUDITFIELD3" /> 

    <sql-insert>exec PKG_PERSONS.insert_sp ?,?</sql-insert> 
    </class> 

這是存儲過程:

create or replace package body PKG_PERSONS is 
    procedure insert_sp(pcod_person persons.cod_person%type, 
         pname  persons.name%type) is 
    begin 
    insert into persons(cod_person, name) values(pcod_person, pname); 
    end; 

從這個映射中,我期待'Id'和'Name'屬性將作爲參數發送,但是肯定的是,這沒有發生;我收到來自Oracle的這個錯誤:ORA-01036:非法變量名稱/編號。 NHibernate在控制檯窗口中顯示了一些日誌,好像NH試圖映射所有屬性(包括AuditFields)來調用存儲過程。

也許這就是源的錯誤?

這是預期的行爲?

是否可以具體送什麼性質與NH3/Oracle的參數?

在此先感謝。

回答

1

證實,NH試圖發送作爲參數的每個實體的屬性映射到存儲<sql-insert>/<sql-update>程序,但你能與插入/更新=假例外。

的另一個問題是執行Oracle11g中的存儲過程的權利sintaxis,這是一個以NH3.3和Oracle.DataAccess 4.112.2.0對我的作品的映射:

<class name="Person" table="PERSONS"> 
    <id name="Id" column="COD_PERSON" /> 
    <property name="Name" column="NAME" /> 

    <property name="AuditField1" column="AUDITFIELD1" insert="false" update="false" /> 
    <property name="AuditField2" column="AUDITFIELD2" insert="false" update="false" /> 
    <property name="AuditField3" column="AUDITFIELD3" insert="false" update="false" /> 

    <sql-insert check="none">begin PKG_PERSONS.insert_sp(:p0,:p1); end;</sql-insert> 
    </class> 

我不得不重新定義參數的順序,因爲ID屬性在最後的位置發送:

create or replace package body PKG_PERSONS is 
    procedure insert_sp(pname  persons.name%type, 
         pcod_person persons.cod_person%type 
        ) is 
    begin 
    insert into persons(cod_person, name) values(pcod_person, pname); 
    end; 

也許這將幫助別人, 感謝。