无法在java中调用Oracle存储过程

tho*_*rca 1 java oracle stored-procedures jdbc ora-06550

我在使用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);
Run Code Online (Sandbox Code Playgroud)

而现在我试着这样称呼它:

CallableStatement cs;

                 try {
                         cs = con.prepareCall("{call LIVERESULTS() }");
                         rs = cs.executeQuery();

                         while (rs.next()) {
 .....
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

 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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚我哪里出错了.我读了Oracle的文档,我相信我做的一切都是正确的,但我猜不是.如果有人能对这种情况有所了解,我会非常感激.

Raj*_*thi 8

这里有很多问题..

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

2)当没有输入/输出/输入输出参数时,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.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

4)您正在创建一个名为"LIVE"的程序并调用"LIVERESULTS".再次,在程序调用之后您不需要().

5)根据Allan的评论和Cyber​​nate的答案(+1),如果你想要返回一个结果集,你应该为你的选择打开一个refcursor,然后将它返回到调用程序.