温馨提示:本文翻译自stackoverflow.com,查看原文请点击:oracle - JDBC: PL/SQL object (procedure) is invalid
jdbc oracle sqlplus

oracle - JDBC:PL / SQL对象(过程)无效

发布于 2020-04-08 11:32:52

JDBC:PL / SQL对象(过程)无效。

String sql = "create procedure foo(name varchar2) as " +
"begin " +
...
"end";

Statement stmt = connection.createStatement();
stmt.execute(sql);
stmt.close();


String sql1 = "begin foo('world'); end;";
CallableStatement s = connection.prepareCall(sql1);
s.execute();
s.close();

执行第二个SQL时出错:

java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00905: object MY_DB.FOO is invalid
ORA-06550: line 1, column 7:

MY_DB是当前的连接用户。在第一个语句之后,无法通过desc Foosqlplus 找到该过程

如果在sqlplus中运行这两个语句,则没有错误。

查看更多

提问者
Sunnyday
被浏览
43
community wiki 2020-02-01 09:05
  • 需要使用分号来终止每个PL / SQL语句,声明和块。
  • 最外面的PL / SQL块通常也以斜杠/字符终止
  • 相反,SQL代码的每个原子项都是单个语句,通常以分号;字符结尾

在SQL / Plus(和SQL Developer)中,终止字符用于表示可执行代码的结尾(根据用户界面的设置,空白行也可以这样做)和下一个开始。

在JDBC中,当您调用一段代码时,您不需要终止符,因为每个调用仅包含一个语句(对于SQL)或(外部)块(对于PL / SQL),并且终止符是多余的。因此,对于通过JDBC调用的PL / SQL语句,您不需要/终止代码,但确实需要;终止代码所组成的语句,声明和块(包括最外面的BEGIN/ END块)。

因此,您的代码应为:

String sql = "create procedure foo(name varchar2) as " +
"begin " +
...
"end;";