代码之家  ›  专栏  ›  技术社区  ›  tofi9

使用nHibernate调用Oracle存储过程

  •  1
  • tofi9  · 技术社区  · 16 年前

    我在Oracle中有一个存储过程:

    procedure Test(results OUT gencursor, id in number) is
      v_cursor gencursor;
    begin
    OPEN v_cursor FOR
              select id, name, age from tblcustomers s where s.id = id;
    results:=v_cursor;
    end Test;
    

    ISession.CreateSQLQuery ISession.GetNamedQuery() .

    ToDataTable 是我自己的扩展方法吗 IQuery ,我有更多的扩展方法,希望与存储过程结合使用):

            var result = session
                .CreateSQLQuery("call MyPackage.Test(:id)")
                .SetDecimal("id", 33)
                .ToDataTable();
    

    上面的代码引发以下异常:

    “无法执行查询[调用] MyPackage.Test(?)名称:id-值:33 [SQL:调用MyPackage.Test(?)”

    我也试过:

            var result = session
                .CreateSQLQuery("call MyPackage.Test(:result, :id)")
                .SetDecimal("id", 33)
                .ToDataTable();
    

    那一个抛出异常:

    并非所有命名参数都已命名 set:[result][call MyPackage.Test(:result, :id)]

    2 回复  |  直到 16 年前
        1
  •  2
  •   Martin R-L    14 年前

    var query =  _session.GetNamedQuery("MyPackageTestSp");
                query.SetParameter("id", 33);
                query.ExecuteUpdate();
    

    <sql-query name="MyPackageTestSp">
        call MyPackage.Test(:result, :id)
    </sql-query>
    

    工作就像一个符咒:-)

        2
  •  0
  •   Adam Fyles    16 年前

    我发现只使用视图更容易。在映射中,只需在类上设置mutable=false,这样它就不能被更新。视图应该创建您试图实现的抽象级别。