java - 无法对 PLSQL 语句执行 fetch : next

标签 java stored-procedures jdbc

存储程序

CREATE OR REPLACE
PROCEDURE ADDITION
  (
    A IN NUMBER ,
    B IN NUMBER ,
    C OUT NUMBER )
AS
BEGIN
  C := A+B;
  dbms_output.put_line(c);
END ADDITION;

JDBC程序

 cstmt = conn.prepareCall("BEGIN addition(?, ?,?); END;");
  cstmt.setInt(1, 10);
  cstmt.setInt(2, 85);
  cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
  ResultSet rs = cstmt.executeQuery();
  while(rs.next()){
  int c =rs.getInt("c");
    System.out.println(c);
  }

执行上述程序时出现错误。

错误:

java.sql.SQLException: Cannot perform fetch on a PLSQL statement: next
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:192)
    at stored_procedure.main(stored_procedure.java:32)

最佳答案

executeQuery() 设计用于处理返回游标的 sql 语句(最常见的是 SELECT 查询)。 您的调用不会返回游标,因此不适合与此方法一起使用。您应该只使用 execute(),然后从输出参数中获取值:

cstmt = conn.prepareCall("BEGIN addition(?, ?,?); END;");
cstmt.setInt(1, 10);
cstmt.setInt(2, 85);
cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
cstmt.execute();
int c = cstmt.getInt(3);
System.out.println(c);

关于java - 无法对 PLSQL 语句执行 fetch : next,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443213/

相关文章:

java - 如何删除组合框中选定的值

mysql - 为mysql中的out参数分配变量值

sql - 如何使用 csv 格式的 where 子句执行 SQL select 语句?

mysql - ElasticSearch 和现有的 MySQL 数据库

java - 运行 jar 时找不到或加载主类

java - Apereo CAS 5.3.x : how to get logged user, 来自 CAS 服务器,在 java cas 客户端登录后

java - 发生异常时的 JDBC 连接管理器和 Connection 对象

grails - Grails + MySQL-BasicDataSource或JNDI

java - JSP - 单击按钮时更新文本区域

mysql - Node.js 中的存储过程有时不返回值