首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC: PL/SQL对象(过程)无效

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

Stack Overflow用户
提问于 2020-01-31 23:32:08
回答 1查看 153关注 0票数 0

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

代码语言:javascript
复制
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时出错:

代码语言:javascript
复制
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中找到该过程。

如果在sqlplus中运行这两个语句,则不会出错。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-01 00:44:07

终止每个PL/SQL语句、声明和块需要分号。最外层的PL/SQL块

  • 通常也以斜杠/字符结尾。
  • 相反,SQL代码的每个原子项都是一条语句,并且通常由一个分号;字符终止。

< code >f29

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

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

所以你的代码应该是:

代码语言:javascript
复制
String sql = "create procedure foo(name varchar2) as " +
"begin " +
...
"end;";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60012618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档