首页 > 解决方案 > PostgreeSQL 函数如何向 Java 应用程序返回多列和多行?

问题描述

我正在尝试使用函数从 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());
    }

这是我不断遇到的错误。请注意,它告诉我该列不存在,这是真的,因为那是一个值而不是列名。有任何想法吗???我知道这可能很简单,我似乎无法确定答案。 在此处输入图像描述

标签: javapostgresqlstored-procedures

解决方案


您发送的查询是

SELECT sp_search_test_ui_test_prog_revision(mnf0306aa)

您是否注意到字符串周围缺少单引号?这就是 PostgreSQL 将其解释为列名并抱怨该列不存在的原因。

使用字符串连接组合查询是危险的,它使您面临 SQL 注入的危险。如果device包含单引号,您的语句将导致错误或更糟——熟练的攻击者可以对您的数据库做任何事情。

使用准备好的语句的力量来避免这种危险:

java.sql.PreparedStatement statement =
    pgConn.prepareStatement("SELECT * FROM sp_search_test_ui_test_prog_revision(?)";
statement.setString(1, device);
java.sql.ResultSet rs = statement.executeQuery();

推荐阅读