【问题标题】:Oracle's function created via jdbc is in an invalid stateOracle 通过 jdbc 创建的函数处于无效状态
【发布时间】:2014-01-31 16:40:47
【问题描述】:

当我在 SQL Developer 中创建 Oracle 的函数时,一切正常,但是当我通过 jdbc 创建相同的函数时,它处于无效状态

这里是函数示例:

create or replace function TEST_FUNC return number is
begin
    return 100;
end;

Java 代码:

Connection con = ...;
Statement stmt = con.createStatement();
stmt.execute(sql);

当我执行函数时:

select TEST_FUNC() from dual;

我收到错误:ORA-06575:包或函数 TEST_FUNC 处于无效状态

你能解释一下我做错了什么吗?

【问题讨论】:

  • 嗯,你看看函数上的错误是什么?
  • select * from user_errors where name = 'TEST_FUNC'
  • @EgorSkriptunoff 它给出:“PLS-00103:遇到符号“”当期望以下之一时:开始函数包杂注过程子类型类型使用 形成当前光标外部语言“。当我在 SQL Developer 中创建相同的函数时,此查询不会显示任何错误。
  • @ako 您在构建填充您的 sql 变量的字符串的 Java 代码中存在错误 - 发布构建传递给 stmt.execute(sql) 的 sql 变量的实际 Java 代码.这就是你的“遇到符号”的来源。只需执行 System.out.println(sql) - 当您尝试在 SQLDeveloper 中编译该输出时,它可能会跳出您的错误。
  • @Brian 我使用 freemarker 从文件中读取 sql。我在我的问题中发布了文件文本。当我将其复制粘贴到 SQL Developer 中时,函数已创建并执行,没有任何错误。

标签: java sql oracle jdbc


【解决方案1】:

需要遵守功能才能使用它们。未编译的函数给出了这个异常。还要确保您的查询中没有任何终止的 CR/LF。将其复制到文本编辑器 (textpad) 以查看是否有。

【讨论】:

  • 如何通过jdbc编译函数?我试过 stmt.execute("alter function TEST_FUNC compile") 但没有帮助。
  • 是的,我在查询中有 CR/LF,因为我是从文件中读取的。它们在 oracle 中被禁止吗?
  • 我会说,是的。不过,我更愿意尝试一下。
  • 感谢您的提示。删除所有 CR/LF 功能后工作。
  • 谢谢。这节省了我的一天
猜你喜欢
  • 2013-05-06
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多