如何在Java中执行Oracle PLSQL块

时间:2015-09-16 17:25:36

标签: java sql oracle jdbc plsql

我有一个像这样的PL / SQL块:

BEGIN
  FOR i IN 1..100
  LOOP
    UPDATE rptbody 
       SET comments = 'abcs';
     WHERE (rptno> 100 and rptno < 200) and ROWNUM<2;
    COMMIT;
  END LOOP;
END;

需要使用Oracle JDBC执行此块。我尝试了以下方法:

  • 尝试使用Statement对象执行此操作。由于这是一个块,因此引发了一个异常,说这不是一个sql语句

  • 这可以分成sql语句,但是我有100个这样的块,这对于代码来说很麻烦,并且想把它留给sqlplus。

  • 尝试使用CallableStatement但效果不佳。

任何解决方案都会有所帮助。

3 个答案:

答案 0 :(得分:5)

这与你如何运行它无关。 PL / SQL语法无效。在;子句之前的更新子句后面有WHERE

BEGIN
  FOR i IN 1..100
  LOOP
    UPDATE rptbody 
       SET comments = 'abcs' --<<< no semicolon here!!
     WHERE (rptno> 100 and rptno < 200) and ROWNUM<2;
    COMMIT;
  END LOOP;
END;

上面的代码可以像这样运行:

String sql = "... the PL/SQL block ...";
Statement stmt = connection.createStatement();
stmt.execute(sql);

答案 1 :(得分:0)

试图使用Statement对象执行此操作。由于这是一个块,因此引发了一个异常,说这不是sql语句

Since you were trying to execute a plsql block, you should not use Statement object. 

来自https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html:    用于执行静态SQL语句并返回其产生的结果的对象。

这是您执行块的方法:

CallableStatement anonBlock = null // Note that CallableStatement is an interface

String anonBlockString = '' //Generally multi line
// Set in and out parameters as needed by your anonBlockString

anonBlock.registerOutParameter( <number> , <type> )

...

// executeUpdate() is inherited from PreparedStatement and can be used for executing DML statements (update, insert, delete)
anonBlock.executeUpdate(); 


To access out parameters:
anonBlock.getString(<number which you have assigned in registerOutParameter() calls);

完整示例:(https://download.oracle.com/otn_hosted_doc/timesten/1121/quickstart/sample_code/jdbc/plsqlJDBC.java

这可以分解为sql语句,但是我有 100个这样的块,这对于代码来说很麻烦,并考虑将其留给sqlplus。 < / p>

首选使用存储过程而不是匿名块。由于存储过程以经过编译和优化的格式存储,因此与匿名存储过程相比,它们具有性能提升

尝试了CallableStatement,但效果不佳:

代码是什么,错误/堆栈是什么?

答案 2 :(得分:0)

签出一些代码示例以在Github上使用CallableStatement和PreparedStatement