java - 什么通过函数调用返回 CallableStatment.executeQuery()?

标签 java sql oracle jdbc plsql

假设有一些 Oracle PL/SQL 过程,它接收 IN 参数并返回 OUT 游标参数。我有一个执行此过程的 jdbc 代码:

DataSource dataSource;
    //datasource was set
    CallableStatement statement = null;
    ResultSet result = null;
    ResultSet secondaryResult = null;
    Connection connection = null;
    try {
        connection = dataSource.getConnection();
        statement = connection.prepareCall("{? = call pl_sql_func(?)}");
        statement.registerOutParameter(1, OracleTypes.CURSOR);
        statement.setString(2,"param");
        // !
        secondaryResult = statement.executeQuery();
        secondaryResult.close();

        result = (ResultSet) statement.getObject(1);

        while(result.next()){
            //get some data
        }

    } catch (Exception ex){

    }

    finally{
        //closing statement, result, secondaryResult and connection
    }

我尝试执行这段代码,发现 secondaryResult 没有数据,但 result 有。这是正常的,但谁能解释一下

1) statement.executeQuery() 真正产生了什么?

2) 语句产生过程调用时,返回的ResultSet是否可以包含数据?或者它总是空的?

P.S.可能的优化不是这个问题的目标。我希望按原样解释代码。

最佳答案

您的语句在输出参数中获取结果。根据 Oracle 教程 http://docs.oracle.com/javase/tutorial/jdbc/basics/storedprocedures.html#create_jdbc_mysql这是获取 ResultSet 作为 CallableStatement.executeQuery 返回值的方法

statement = connection.prepareCall("{call pl_sql_func(?)}");

这个例子是针对 MySQL 的,但是思路很清晰。

关于java - 什么通过函数调用返回 CallableStatment.executeQuery()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18501795/

相关文章:

在联合中使用时,Oracle 流水线函数无法访问远程表 (ORA-12840)

java - 子类构造函数是否需要父类(super class)构造函数的所有参数?

java - JSTL forEach 分隔符

java - 我可以要求泛型参数具有泛型参数吗?

java - 错误: Unsupported Media Type (Codename One)

Mysql期间列和连接表

sql - 组合行以创建两列数据

sql - 找出哪些记录对的位置可以在一组组合记录中安全地切换

java - 在MySQL中根据条件检索数据

oracle - 如何在 sql-loader 中使用 to_number 和 nullif?