我有一个像这样的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但效果不佳。
任何解决方案都会有所帮助。
答案 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