Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中调用Oracle存储过程时遇到问题_Java_Oracle_Stored Procedures_Jdbc_Ora 06550 - Fatal编程技术网

在java中调用Oracle存储过程时遇到问题

在java中调用Oracle存储过程时遇到问题,java,oracle,stored-procedures,jdbc,ora-06550,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_

我在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

我不太明白我错在哪里。我阅读了甲骨文的文档,我相信我做的一切都是对的,但我想不是。如果有人能解释一下这种情况,我将不胜感激。

存储过程
LIVE
编译时不会出错,因为SP中有一个SELECT语句WITH INTO子句是无效的


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

存储过程
LIVE
将不会编译无错误,因为SP中的SELECT语句WITH INTO子句无效

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

创建或替换过程LIVE()
是
开始
结束;
[编辑]

创建或替换过程LIVE()
是
开始
结束;

[编辑]

这里有多个问题

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) 第三个错误是,您正在从表中选择字段,但没有选择字段的变量

  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打开一个REF游标,然后将其返回给调用程序。

这里有多个问题

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) 第三个错误是,您正在从表中选择字段,但没有选择字段的变量

  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),如果您试图返回结果集,您应该为您的选择打开一个参考光标,然后将其返回给调用程序。

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

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

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


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

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

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

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


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

您可以创建proc
LIVE
并调用
LIVERESULTS
@JustYo:不,错误非常具体(OP应该通过google或nnn查看它是什么)。这是一个常见的语法错误,表明ORA甚至从未调用过错误的proc。它无法为“live()”生成必要的SQL(例如PLS-00905),因为过程def的“第1行”缺少required is关键字(例如语法错误ORA-06550)。我实际上已经在那里了,还有正确的LIVERESULTS匹配项(我复制错误了)。我已经在谷歌上搜索过了,但我还是有点卡住了。在WHERE条款之前,你还有ORDER BY。请参阅下面Rajesh的回答。您打算如何处理该程序?即使