首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate 3.3:<sql>执行Oracle11g存储过程

NHibernate 3.3:<sql>执行Oracle11g存储过程
EN

Stack Overflow用户
提问于 2012-04-30 21:31:49
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
复制
  <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>

这是存储过程:

代码语言:javascript
复制
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’属性将作为参数发送,但肯定不会发生这种情况;我从OracleOra-01036:非法变量名称/数字中得到了这个错误。NHibernate在控制台窗口中显示了一些日志,看起来NH试图映射所有属性,包括AuditFields,以调用存储过程。

也许这就是源头的错误?

这是预期的行为吗?

是否可以在NH3/Oracle中指定哪些属性作为参数发送?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-01 17:22:02

确认后,NH尝试将映射到<sql-insert>/<sql-update>存储过程的每个实体的属性作为参数发送,但是您可以使用insert/update=false进行异常。

另一个问题是执行Oracle11g存储过程的正确的sintaxis,这是对NH3.3和Oracle.DataAccess 4.112.2.0适用的映射:

代码语言:javascript
复制
  <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属性在最后一个位置发送:

代码语言:javascript
复制
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;

也许这个能帮到别人谢谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10390871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档