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 error 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;";
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 error 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;";