【问题标题】:REF CURSOR is not working with pgjdbc-ng driverREF CURSOR 不适用于 pgjdbc-ng 驱动程序
【发布时间】:2020-10-27 08:16:54
【问题描述】:

我正在尝试使用 PGJDBC-NG 驱动程序返回 REFCURSOR 的示例,但出现异常

java.lang.ClassCastException: java.lang.String cannot be cast to java.sql.ResultSet
    at FunctionReturnRefCursor.main(FunctionReturnRefCursor.java:42)

我正在尝试的源代码/代码是 -

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;

public class FunctionReturnRefCursor {

public static void main(String[] args) throws Exception {

    String createFunction = "CREATE OR REPLACE FUNCTION getUsers(mycurs OUT refcursor) "
            + " RETURNS refcursor "
            + " AS $$ "
            + " BEGIN "
            + "     OPEN mycurs FOR select * from pg_user; "
            + " END; "
            + " $$ "
            + " LANGUAGE plpgsql";

    String runFunction = "{? = call getUsers()}";

    Class.forName("com.impossibl.postgres.jdbc.PGDriver");
    try (Connection conn = DriverManager.getConnection(
            "jdbc:pgsql://localhost:5432/test", "postgres", "password");
         Statement statement = conn.createStatement();
         CallableStatement cs = conn.prepareCall(runFunction);
    ) {

        // We must be inside a transaction for cursors to work.
        conn.setAutoCommit(false);
        // create function
        statement.execute(createFunction);
        // register output
        cs.registerOutParameter(1, Types.REF_CURSOR);

        // run function
        cs.execute();

        // get refcursor and convert it to ResultSet
        ResultSet resultSet = (ResultSet) cs.getObject(1);
        while (resultSet.next()) {
            System.out.println(resultSet.getString("usename"));
            System.out.println(resultSet.getString("passwd"));
        }

    } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

【问题讨论】:

    标签: java postgresql sys-refcursor ref-cursor pgjdbc-ng


    【解决方案1】:

    试试这个:

    import java.sql.*;
    
    public class FunctionReturnRefCursor {
    
        public static void main(String[] args) {
    
            String createFunction = "CREATE OR REPLACE FUNCTION getUsers(mycurs OUT refcursor) "
                    + " RETURNS refcursor "
                    + " AS $$ "
                    + " BEGIN "
                    + "     OPEN mycurs FOR select * from pg_user; "
                    + " END; "
                    + " $$ "
                    + " LANGUAGE plpgsql";
    
            String runFunction = "{? = call getUsers()}";
    
            //Substituted:
            Driver driver = null;
            try {
                driver = new com.impossibl.postgres.jdbc.PGDriver();
                DriverManager.registerDriver(driver);
            } catch (SQLException e) {
                e.printStackTrace();
            }//:Substituted
            try (Connection conn = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/test", "postgres", "password");
                 Statement statement = conn.createStatement();
                 CallableStatement cs = conn.prepareCall(runFunction);
            ) {
    
                // We must be inside a transaction for cursors to work.
                conn.setAutoCommit(false);
    
                // create function
                statement.execute(createFunction);
    
                // register output
                cs.registerOutParameter(1, Types.REF_CURSOR);
    
                // run function
                cs.execute();
    
                // get refcursor and convert it to ResultSet
                ResultSet resultSet = (ResultSet) cs.getObject(1);
                while (resultSet.next()) {
                    System.out.println(resultSet.getString("usename"));
                    System.out.println(resultSet.getString("passwd"));
                }
    
            } catch (SQLException e) {
                System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }
    

    【讨论】:

    • 使用 pgjdbc-ng 驱动时,URL 不能是“jdbc:postgresql://localhost:5432/test”,必须是“jdbc:pgsql://localhost:5432/test”。如果我在 URL 中使用 pgsql,我仍然会遇到同样的异常
    • @LAKS 你问过pgjdbc-ng开发团队这个问题吗?
    • 我已在github.com/impossibl/pgjdbc-ng 上发布了查询/问题,但尚未收到他们的任何回复
    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2011-05-11
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多