我将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在Console窗口中显示了一些日志,似乎NH尝试映射所有属性,包括AuditFields,以调用存储过程。
这可能是源的错误吗?
这是预期的行为吗?
是否可以使用NH3 / Oracle特定哪些属性作为参数发送?
提前致谢。
答案 0 :(得分:1)
确认,NH尝试将映射到<sql-insert>/<sql-update>
存储过程的每个实体的属性作为参数发送,但是您可以使用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;
也许这会对别人有所帮助, 感谢。