【问题标题】:NHibernate 3.3: <sql-insert> executing an Oracle 11g stored procedureNHibernate 3.3:<sql-insert> 执行 Oracle 11g 存储过程
【发布时间】:2012-04-30 21:31:49
【问题描述】:

我正在将一个 Oracle 11g 存储过程映射为 NHibernate 的 .hbm.xml 映射文件中的命令,如下所示:

  <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 指定哪些属性作为参数发送?

提前致谢。

【问题讨论】:

    标签: oracle nhibernate stored-procedures parameters sql-insert


    【解决方案1】:

    已确认,NH 尝试将映射到 &lt;sql-insert&gt;/&lt;sql-update&gt; 存储过程的每个实体的属性作为参数发送,但您可以使用 insert/update=false 设置例外。

    另一个问题是执行 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;
    

    也许这会对其他人有所帮助, 谢谢。

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多