Java 如何在调用postgresql函数时获取动态结果集

Java 如何在调用postgresql函数时获取动态结果集,java,postgresql,stored-procedures,jdbc,callable-statement,Java,Postgresql,Stored Procedures,Jdbc,Callable Statement,我用PostgreSQL编写了一个带有if和else if条件的存储过程。在每个条件下,都有返回不同结果的不同查询。如何使用resultset.getString()方法在Java中访问结果 存储过程: CREATE FUNCTION public."testDynamicReturn"(_tagId character varying) RETURNS ??? -- what should be written in the place of ??? LANGUAGE 'plp

我用PostgreSQL编写了一个带有if和else if条件的存储过程。在每个条件下,都有返回不同结果的不同查询。如何使用
resultset.getString()
方法在Java中访问结果

存储过程:

CREATE FUNCTION public."testDynamicReturn"(_tagId character varying)
    RETURNS ??? -- what should be written in the place of ???
    LANGUAGE 'plpgsql'

AS $BODY$
BEGIN

        IF _tagId == 'stu' then 
            RETURN query
            SELECT "StudentRollNo.","StudentName","GuardianName" FROM public."DetailsOfStudents";
        ELSE if _tagId == 'teach' then
            RETURN query
            SELECT "TeacherName","TeacherAddress" FROM public."DetailsOfTeachers";

END;
$BODY$;
Java代码:

    public static void main(String[] args) {
        Connection connection = DBUtility.getDBConnection();
        String sp = "{ call \"testDynamicReturn\"(?)}";

        try {
            CallableStatement statement = connection.prepareCall(sp);
            statement.setString(1, "stu");
            statement.execute();

            ResultSet resultSet = statement.getResultSet();
            while (resultSet.next()) {
                String a = resultSet.getString(???);
                System.out.println(a);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
如果我将“stu”作为存储过程参数发送,则结果将是:

--------------------------------------------
StudentRollNo.| StudentName | GuardianName |
--------------------------------------------
15600223596   | John        |   Doe        |
--------------------------------------------
------------------------------
TeacherName | TeacherAddress |
------------------------------
Adam        | New york       |
------------------------------
如果我将“teach”作为存储过程参数发送,则结果将是:

--------------------------------------------
StudentRollNo.| StudentName | GuardianName |
--------------------------------------------
15600223596   | John        |   Doe        |
--------------------------------------------
------------------------------
TeacherName | TeacherAddress |
------------------------------
Adam        | New york       |
------------------------------
请回答如何实现上述功能。

以下是功能:

CREATE OR REPLACE FUNCTION  public.testDynamicReturn(_tagId character varying)
    RETURNS TABLE (out_rollNum character varying, out_name character varying, out_gaurdian character varying) 
    AS 
    $func$
    BEGIN
     IF _tagId = 'stu' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName","GuardianName" FROM public."DetailsOfStudents";  
               END IF;
         IF _tagId = 'teach' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName", CAST (null AS character varying) "GuardianName" FROM public."DetailsOfStudents";
               END IF;

    END
    $func$  LANGUAGE plpgsql;
 PreparedStatement statement = conn.prepareStatement("select * from public.testDynamicReturn('stu')");

ResultSet resultSet = statement.executeQuery();

while (resultSet.next()) {
 //can give column name
 String rollNum= resultSet.getString("out_rollNum");   
  String name= resultSet.getString("out_name");   
  //will be null for 'stu'but you already know
  String gaurdian= resultSet.getString("out_gaurdian");    
}
下面是调用此动态函数的代码:

CREATE OR REPLACE FUNCTION  public.testDynamicReturn(_tagId character varying)
    RETURNS TABLE (out_rollNum character varying, out_name character varying, out_gaurdian character varying) 
    AS 
    $func$
    BEGIN
     IF _tagId = 'stu' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName","GuardianName" FROM public."DetailsOfStudents";  
               END IF;
         IF _tagId = 'teach' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName", CAST (null AS character varying) "GuardianName" FROM public."DetailsOfStudents";
               END IF;

    END
    $func$  LANGUAGE plpgsql;
 PreparedStatement statement = conn.prepareStatement("select * from public.testDynamicReturn('stu')");

ResultSet resultSet = statement.executeQuery();

while (resultSet.next()) {
 //can give column name
 String rollNum= resultSet.getString("out_rollNum");   
  String name= resultSet.getString("out_name");   
  //will be null for 'stu'but you already know
  String gaurdian= resultSet.getString("out_gaurdian");    
}
以下是函数:

CREATE OR REPLACE FUNCTION  public.testDynamicReturn(_tagId character varying)
    RETURNS TABLE (out_rollNum character varying, out_name character varying, out_gaurdian character varying) 
    AS 
    $func$
    BEGIN
     IF _tagId = 'stu' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName","GuardianName" FROM public."DetailsOfStudents";  
               END IF;
         IF _tagId = 'teach' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName", CAST (null AS character varying) "GuardianName" FROM public."DetailsOfStudents";
               END IF;

    END
    $func$  LANGUAGE plpgsql;
 PreparedStatement statement = conn.prepareStatement("select * from public.testDynamicReturn('stu')");

ResultSet resultSet = statement.executeQuery();

while (resultSet.next()) {
 //can give column name
 String rollNum= resultSet.getString("out_rollNum");   
  String name= resultSet.getString("out_name");   
  //will be null for 'stu'but you already know
  String gaurdian= resultSet.getString("out_gaurdian");    
}
下面是调用此动态函数的代码:

CREATE OR REPLACE FUNCTION  public.testDynamicReturn(_tagId character varying)
    RETURNS TABLE (out_rollNum character varying, out_name character varying, out_gaurdian character varying) 
    AS 
    $func$
    BEGIN
     IF _tagId = 'stu' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName","GuardianName" FROM public."DetailsOfStudents";  
               END IF;
         IF _tagId = 'teach' then 
               --validate your select, ensure it works independently
               RETURN QUERY  SELECT "StudentRollNo.","StudentName", CAST (null AS character varying) "GuardianName" FROM public."DetailsOfStudents";
               END IF;

    END
    $func$  LANGUAGE plpgsql;
 PreparedStatement statement = conn.prepareStatement("select * from public.testDynamicReturn('stu')");

ResultSet resultSet = statement.executeQuery();

while (resultSet.next()) {
 //can give column name
 String rollNum= resultSet.getString("out_rollNum");   
  String name= resultSet.getString("out_name");   
  //will be null for 'stu'but you already know
  String gaurdian= resultSet.getString("out_gaurdian");    
}

这不是我的答案。我的问题是如何通过java编写SP和access。SP不返回任何值。我问的是SP的语法。你的查询说你已经编写了SP,你正在研究如何访问它。这不是我的答案。我的问题是如何通过java编写SP和access。SP不返回任何值。我在询问SP的语法。您的查询说您已经编写了SP,并且正在研究如何访问它。