在java中调用Oracle存储过程有问题



我在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)当没有in/out/in-out参数时,Oracle不期望(),所以您不需要它们。您还需要as"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"的过程并调用"liverresults"。同样,在Procedure调用之后不需要()。

5)根据Allan下面的评论和Cybernate的回答(+1),如果你试图返回一个结果集,你应该为你的选择打开一个refcursor,然后将其返回给调用程序。

存储过程LIVE将不能没有错误地编译,因为您在SP中有一个没有INTO子句的SELECT语句,这是无效的。

这就是问题所在。使用REF CURSOR返回结果集。

除了其他都很好的答案…

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

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

您需要在调用过程之前解决PL/SQL编译错误。

您缺少[必需的]IS(或'AS')。

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

相关内容

  • 没有找到相关文章

最新更新