[英]Having trouble calling Oracle stored procedure in java
我无法在 Java 中调用 Oracle 存储过程。 我在数据库中添加了一个存储过程,如下所示:
String SQL = "CREATE OR REPLACE PROCEDURE LIVERESULTS() " +
"IS " +
"BEGIN" +
" SELECT POOL_ID, POOL_MBR_ID, BSLN_CD, PGE_TYP_NM, SERV_NM, CL_FILE_NM" +
" FROM LBMADM.TPPO_MSTR_MAP " +
" ORDER BY SERV_NM" +
" WHERE PGE_TYP_NM = 'live' ; " +
"END";
stmtLIVE = con.createStatement();
stmtLIVE.executeUpdate(SQL);
现在我试着这样称呼它:
CallableStatement cs;
try {
cs = con.prepareCall("{call LIVERESULTS() }");
rs = cs.executeQuery();
while (rs.next()) {
.....
但是,我收到以下错误:
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00905: object UT9J.GENERATE_SQL_FOR_LIVE is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
我无法完全弄清楚我哪里出错了。 我阅读了 Oracle 的文档,我相信我做的一切都是正确的,但我想不是。 如果有人能对这种情况有所了解,我将不胜感激。
这里有多个问题..
1)为什么要在Java代码里面创建程序? 您应该使用 SQLPLUS 或任何其他数据库工具直接在 Oracle 中创建它。
2) Oracle 在没有 in/out/in-out 参数时不期望 (),因此您不需要它们。 您还需要在“创建或替换过程”之后作为“as”或“is”关键字。 否则,这将给出您所看到的编译时错误..
1 CREATE OR REPLACE PROCEDURE LIVE
2 IS
3 begin
4 null; ---This would usually have your logic,
--Null indicates "DO nothing". Just to concentrate on
--the "declare" issues
5* end;
SQL> /
Procedure created.
3)第三个错误是您正在从表中选择字段,但没有您选择它们的变量“INTO”。
1 CREATE OR REPLACE PROCEDURE LIVE
2 AS
3 v_ename scott.emp.ename%type;
4 begin
5 select ename
6 from scott.emp
7 where empno = 7369;
8* end;
SQL> /
Warning: Procedure created with compilation errors.
SQL> show errors
Errors for PROCEDURE LIVE:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3 PLS-00428: an INTO clause is expected in this SELECT statement
1 CREATE OR REPLACE PROCEDURE LIVE
2 AS
3 v_ename scott.emp.ename%type;
4 begin
5 select ename
6 into v_ename
7 from scott.emp
8 where empno = 7369;
9* end;
SQL> /
Procedure created.
4)您正在创建一个名为“LIVE”的过程并调用“LIVERESULTS”。同样,在过程调用之后您不需要 ()。
5) 根据 Allan 下面的评论和 Cybernate 的回答 (+1),如果您尝试返回结果集,您应该为您的 select 打开一个 refcursor,然后将其返回给调用程序。
存储过程LIVE
将不会正确编译,因为您有一个 SELECT STATEMENT 在无效的 SP 中没有 INTO 子句。
因此问题。 使用 REF CURSOR 返回结果集。
除了其他答案,这些都很好......
您可能期望由于CREATE PROCEDURE
不会引发 SQLException,因此该过程编译成功。 但这只是表明它作为 SQL 语句成功——即创建了一个过程。 然后必须将该过程编译为 PL/SQL 代码,并且由于其他人指出的各种语法错误而失败。 在这种情况下,程序被创建,所以SQL成功,但是它有错误并且无效。
如 Rajesh 的回答所示,Oracle 特定工具(如 SQL*Plus)会意识到这一点并显示适当的反馈(“过程创建时出现编译错误”)。 JDBC 不会自动检查这个。 如果您确实需要从 Java 进行创建,则应在执行CREATE
后立即检查错误: SELECT * FROM USER_ERRORS WHERE NAME='LIVERESULTS'
。 这将返回与 SQL*Plus SHOW ERRORS
命令显示的基本相同的信息。
您需要先解决 PL/SQL 编译错误,然后才能调用该过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.