0

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

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();
    }

}
}
4

1 回答 1

0

尝试这个:

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();
        }

    }
}
于 2020-07-09T13:08:28.727 回答