1

次のように、NHibernateの.hbm.xmlマッピングファイルにコマンドとしてOracle11gストアドプロシージャをマッピングしています。

  <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でパラメータとして送信するプロパティを特定することは可能ですか?

前もって感謝します。

4

1 に答える 1

1

NH は、<sql-insert>/<sql-update>ストアド プロシージャにマップされたすべてのエンティティのプロパティをパラメーターとして送信しようとしますが、insert/update=false で例外を作成できることが確認されました。

別の問題は、Oracle11g のストアド プロシージャを実行するための正しい構文でした。これは、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-01T17:22:02.410 に答える