【问题标题】:Exception thrown when one parameter of an Oracle stored function is nullOracle存储函数的一个参数为空时抛出的异常
【发布时间】:2025-12-06 01:40:01
【问题描述】:

我想使用命名查询调用 PL/SQL 函数。 其中一个参数给我带来了问题。在 PL/SQL 定义中,它的类型是 NUMBER。 这是设置它的Java代码: q.setParameter (Test.DISTRICT_ID_PARAM,districtId); districtIdLong

districtId 不为空时,一切正常,但当它为空时,结果如下: org.hibernate.exception.SQLGrammarException: could not execute query

我确信管道没有问题,因为当districtId 不为空时查询运行良好。

【问题讨论】:

    标签: hibernate plsql persistence named-query


    【解决方案1】:

    我不特别熟悉 Java 或 Hibernate,但在我编写的 Oracle 应用程序中,我遇到过使用空参数 (C#) 的类似行为 - 如果 Java 有这个概念,您是否尝试过将参数值设置为为 DB null(在 C# DBNull.Value 中)?

    如果该值为 null,我认为 Oracle 将其解释为根本没有传递参数。

    【讨论】:

    • DB 函数接受另外 3 个 VARCHAR2 类型的参数。我以与前一个相同的方式设置它们,并且一切正常,即使它们为空。我想知道的是,在 NUMBER 参数方面是否有不同之处。
    • @RaduStoenescu:从 PL/SQL 参数传递的角度来看,将 null 参数传递给 varchar2 或 number 类型没有区别。
    • @MarkWatts:如果您将带有空值的参数传递给 PL/SQL 函数,则函数会看到该参数并且参数的值为空。
    • @user272735 直接调用 PL/SQL 时确实如此(例如,通过 SQL*Plus 或类似方法),但在通过代码调用 Oracle 时,当然在 .Net 中,定义参数之间存在差异值为 null 和 DBNull.Value。使用 null 会产生错误 ORA-01008。但是,这对于 VARCHAR2 和 NUMBER 类型似乎都是正确的,因此可以排除它作为 Radu 问题的根源。