java - 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());
}
这是我不断遇到的错误。请注意,它告诉我该列不存在,这是真的,因为那是一个值而不是列名。有任何想法吗???我知道这可能很简单,我似乎无法确定答案。
解决方案
您发送的查询是
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();
推荐阅读
- angular - 如何重置 Angular 材质切换
- python - 带有字符串常量的 Python 枚举类
- sharepoint-online - 如何将数组过滤到第一条记录?
- f# - F# 模式匹配:在构造函数中使用不正确时如何解释“as”?
- excel - SUMIFS Excel 多标准
- html - Selenium -- 试图访问某些字段
- javascript - 如何使用 Redux 和 React 获取单个数据库条目?
- vhdl - Testbench 在 Modelsim 中返回未定义的值
- javascript - javascript控制台日志显示几个值
- sql - 使用维恩图来描述表是集合的 SQL 连接是否合适?