【问题标题】:How to execute an Oracle function that returns a sys_refcursor using NHibernate?如何使用 NHibernate 执行返回 sys_refcursor 的 Oracle 函数?
【发布时间】:2013-06-25 20:35:27
【问题描述】:

这是函数:

FUNCTION GET_ALL(P_USER_ID IN VARCHAR2) RETURN SYS_REFCURSOR IS
   C SYS_REFCURSOR;
BEGIN
    OPEN C
    FOR 'SELECT * FROM XYZ WHERE USER_ID = :P_USER_ID'
    USING P_USER_ID;

    RETURN C;
END;

我正在尝试使用 NHibernate 调用此函数,如下所示:

Session
    .CreateSQLQuery("BEGIN ? = PKG.GET_ALL(:P_USER_ID); END;")
    .SetString("P_USER_ID", "SOMEONE")
    .List<XYZ>();

欢迎提供任何代码、提示或烟雾标志。

PS:我使用的是 NHibernate 3.3.0.GA

【问题讨论】:

标签: oracle nhibernate


【解决方案1】:

来自official docs

对于 Oracle,适用以下规则:

函数必须返回结果集。 a的第一个参数 过程必须是返回结果集的 OUT。这是由 在 Oracle 9 或 10 中使用 SYS_REFCURSOR 类型。在 Oracle 中,您需要 定义 REF CURSOR 类型,请参阅 Oracle 文献。

https://github.com/nhibernate/nhibernate-core/tree/master/src/NHibernate.Test/SqlTest/Custom/Oracle 处有完整映射和存储过程代码的工作测试

【讨论】:

  • 是的,我的函数返回一个结果集。它使用 sys_refcursor。但是……文档并没有说明你是如何将所有这些东西放在一起的。
  • 您应该有一个 out 参数,而不是返回值。查看添加的链接。
  • @DiegoMijelshon 真的没有办法使用返回 sys_refcursor 的函数吗?我支持一些代码,这种模式适用于 NHibernate 3.1,但在更新 NHibernate 后不起作用
猜你喜欢
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2016-06-23
相关资源
最近更新 更多