PostgreeSQL函数如何向Java应用程序返回多个列和行?
我试图使用函数从1个表中获取3个字段,但出现错误:PostgreeSQL函数如何向Java应用程序返回多个列和行?,java,postgresql,stored-procedures,Java,Postgresql,Stored Procedures,我试图使用函数从1个表中获取3个字段,但出现错误: CREATE OR REPLACE FUNCTION sp_search_test_ui_test_prog_revision(dev TEXT) RETURNS table (dev_op_test_id BIGINT, test_program_name TEXT, test_program_revision TEXT) AS $$ BEGIN RETURN QUERY SELECT dev_op_test_id, test_pr
CREATE OR REPLACE FUNCTION sp_search_test_ui_test_prog_revision(dev TEXT)
RETURNS table (dev_op_test_id BIGINT, test_program_name TEXT, test_program_revision TEXT)
AS $$
BEGIN
RETURN QUERY
SELECT dev_op_test_id, test_program_name, test_program_revision
FROM dev_op_test
WHERE device = dev
ORDER BY dev_op_test_id;
END;
$$ LANGUAGE plpgsql;
JAVA代码如下:(设备是传递给此方法的字符串)这是错误所在吗
// Get unique devices from dev_op_test
String sql = " SELECT sp_search_test_ui_test_prog_revision(" + device + ") ";
PreparedStatement statement = pgConn.prepareStatement(sql);
ResultSet rs = statement.executeQuery();
// Clear from previous run
cboTestProgDev.getItems().clear();
while (rs.next()) {
TestProgRev tpr = new TestProgRev();
tpr.setDevOpTestId(rs.getLong(1));
tpr.setTestProgramName(rs.getString(2));
tpr.setTestProgramRevision(rs.getString(3));
testProgs.add(tpr);
cboTestProgDev.getItems().add(tpr.toString());
}
这就是我一直犯的错误。注意,它告诉我列不存在,这是真的,因为这是一个值,而不是列名。有什么想法吗???我知道这可能很简单,但我似乎不太明白。
您发送的查询是
选择sp\u搜索\u测试\u ui\u测试\u程序修订版(mnf0306aa)
您注意到字符串周围缺少单引号了吗?这就是PostgreSQL将其解释为列名并抱怨该列不存在的原因
使用字符串连接组合查询是危险的,它使您面临SQL注入的危险。如果device
包含一个引号,则您的语句将导致错误或更糟的情况–熟练的攻击者可以对您的数据库执行任何操作
使用事先准备好的陈述的力量来避免这种危险:
java.sql.PreparedStatement语句=
pgConn.prepareStatement(“从sp搜索测试ui测试程序修订(?)中选择*);
语句.设置字符串(1,设备);
java.sql.ResultSet rs=statement.executeQuery();
正如我在你上一篇文章中所说的,请看-如果你认为postgresql
网站是错误的,那么请告诉我们原因。非常感谢!将单引号隔开了好几个小时!!!而且,按照你的建议正确地实施了这一点!我知道我遗漏了一些简单的东西。再次感谢!和平…@Christopher.Reynolds:因为这是一个set返回函数,你也应该像表格一样使用它。select*from sp\u search\u test\u ui\u test\u prog\u revision(?)
我就是这么做的。效果很好!谢谢!