1

我无法在 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 的文档,我相信我做的一切都是正确的,但我想不是。如果有人能对这种情况有所了解,我将不胜感激。

4

4 回答 4

8

这里有多个问题..

1) 为什么要在 Java Code 中创建过程?您应该使用 SQLPLUS 或任何其他数据库工具直接在 Oracle 中创建它。

2) 当没有 in/out/in-out 参数时,Oracle 不期望 (),因此您不需要它们。您还需要在“创建或替换过程”之后作为“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 下面的评论和 Cyber​​nate 的回答 (+1),如果您尝试返回结果集,您应该为您的选择打开一个 refcursor,然后将其返回给调用程序。

于 2011-07-22T13:47:19.847 回答
4

存储过程LIVE不会被编译而没有错误,因为您在 SP 中有一个没有 INTO 子句的 SELECT STATEMENT 是无效的。

因此问题。使用 REF CURSOR 返回结果集。

于 2011-07-22T13:39:25.987 回答
2

除了其他答案,这些都很好......

您可能期望由于CREATE PROCEDURE不会引发 SQLException,因此该过程编译成功。但这只是表明它作为 SQL 语句成功——即创建了一个过程。然后必须将该过程编译为 PL/SQL 代码,并且由于其他人指出的各种语法错误而失败。在这种情况下,创建了过程,因此 SQL 成功,但它有错误并且无效。

一个特定于 Oracle 的工具,如 SQL*Plus,意识到了这一点并显示适当的反馈(“过程创建时出现编译错误”),如 Rajesh 的回答所示。JDBC 不会自动检查这一点。如果您确实需要从 Java 进行创建,则应在执行CREATE: 后立即检查错误SELECT * FROM USER_ERRORS WHERE NAME='LIVERESULTS'SHOW ERRORS这将返回与 SQL*Plus命令显示的基本相同的信息。

您需要先解决 PL/SQL 编译错误,然后才能调用该过程。

于 2011-07-22T17:05:18.863 回答
0

您缺少 [required] IS(或 'AS')

CREATE OR REPLACE PROCEDURE LIVE() 
IS 
BEGIN
   <the body here> 
END;

[编辑]

于 2011-07-22T13:40:12.743 回答