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

JDBC: PL/SQL object (procedure) is invalid

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 Foo 从 sqlplus 中找不到该过程。

NO er​​ror if 运行这两个语句在sqlplus中。

  • 需要分号来终止每个 PL/SQL 语句、声明和块。
  • 最外面的 PL/SQL 块通常也以斜杠 / 字符结束。
  • 相比之下,SQL 代码的每个原子项都是单个语句,通常以分号 ; 字符结尾。

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

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

所以你的代码应该是:

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