PostgreeSQL函数如何向Java应用程序返回多个列和行?

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

我试图使用函数从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_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(?)
我就是这么做的。效果很好!谢谢!