如何在调用 postgresql 函数时获取动态结果集
How to get dynamic resultset on calling a postgresql function
我在 PostgreSQL 中编写了一个带有 if 和 else if 条件的存储过程。在每个条件下都有不同的查询 return 不同的结果。如何使用 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 |
--------------------------------------------
如果我将 "teach" 作为存储过程参数发送,则结果将是:
------------------------------
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");
}
我在 PostgreSQL 中编写了一个带有 if 和 else if 条件的存储过程。在每个条件下都有不同的查询 return 不同的结果。如何使用 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 |
--------------------------------------------
如果我将 "teach" 作为存储过程参数发送,则结果将是:
------------------------------
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");
}