从java应用程序动态构建oracle sql查询
如何从java应用程序动态构建oracle pl/sql查询?用户将看到数据库中不同表中的一组列。用户可以选择任何一组列,应用程序应该只使用包含所选列的表来构建完整的select查询。 例如,让我们考虑数据库中有3个表。用户选择col11、col22。在这种情况下,应用程序应仅使用Tabl1和Tabl2构建查询。 我如何做到这一点从java应用程序动态构建oracle sql查询,java,sql,oracle,dynamic,Java,Sql,Oracle,Dynamic,如何从java应用程序动态构建oracle pl/sql查询?用户将看到数据库中不同表中的一组列。用户可以选择任何一组列,应用程序应该只使用包含所选列的表来构建完整的select查询。 例如,让我们考虑数据库中有3个表。用户选择col11、col22。在这种情况下,应用程序应仅使用Tabl1和Tabl2构建查询。 我如何做到这一点 Tabl1 - col11 - col12 - col13 Tabl2 - fkTbl1 - col21 - col22 - col23 Tabl3
Tabl1
- col11
- col12
- col13
Tabl2
- fkTbl1
- col21
- col22
- col23
Tabl3
- col31
- col32
- col33
- fkTbl1
我在过去做过这类事情的方法是使用StringBuilder动态构造SQL查询,然后使用JDBC执行它,这是一条未准备好的语句。这是相当低效的,因为Oracle DB必须为每个查询重复所有的查询分析和优化工作。我过去做过这种事情的方法是使用StringBuilder动态构造SQL查询,然后使用JDBC执行它,这是一条未准备好的语句。这是相当低效的,因为Oracle DB必须为每个查询重复所有的查询分析和优化工作。临时报告是一个古老的爱好。它经常作为一行出现在报告要求部分的末尾:“用户必须能够定义和运行自己的报告”。唯一的障碍是临时报告本身就是一个应用程序 你说 “将向用户显示一个 中存在的一组列 数据库中的不同表。” 如果预先选择并严格控制“一串列”(以及表的排列),您可以避免我在下面讨论的一些复杂性。唉,由于临时报告的性质,用户几乎需要所有表中的所有列 让我们从你的例子开始。用户已选择了
col11
和col22
,因此需要生成此查询:
SELECT tabl1.col11
, tabl2.col22
FROM tabl1 JOIN tabl2
ON (TABL1.ID = TABL2.FKTABL1)
/
那不太难。您只需浏览数据字典视图USER\u CONSTRAINTS
和USER\u CONS\u COLUMNS
,即可在联接条件中建立列-前提是您已定义外键(请使用外键!)
如果我们添加第四个表,事情会变得更加复杂:
Tabl4
- col41
- col42
- col43
- fkTbl2
现在,当用户选择col11
和col42
时,您需要导航数据字典,以确定Tabl2
充当中间表,以加入Tabl4
和Tabl1
(假设您没有使用复合主键,因为大多数人没有使用)。但是假设用户选择了col31
和col41
。这是合法的组合吗?假设是这样。现在您必须将Tabl4
加入Tabl2
加入Tabl1
加入Tabl3
。嗯
如果用户从两个完全不相关的表中选择列——Tabl1
和Tabl23
?您是盲目地生成交叉联接还是抛出异常?选择权在你
回到第一个查询,它将返回两个表中的所有行。几乎可以肯定的是,您的用户会希望该选项限制结果集。因此,您需要为他们提供将过滤器添加到WHERE
子句的功能。这里的问题包括:
- 确保提供的值具有适当的数据类型(数字没有字符串,日期没有数字)
- 提供参考数据的查找
价值观
- 处理列表中的多个值(
)
(而不是平等)
- 确保日期范围合理
(开盘前开盘)
- 处理自由文本搜索(你是吗
你会允许吗?你需要吗
使用文本索引,还是运行
用户执行类似的
的风险
“%whatever%”
针对某些CLOB
柱?)
最后一点强调了临时报告中固有的一个风险:如果用户可以使用任何过滤器从任何表中组合查询,那么他们可以组合查询,从而耗尽系统中的所有资源。因此,采取措施防止这种情况发生是一个好主意。另外,正如我已经提到的,用户可以构建无意义的查询。请记住,模式中不需要太多的表来生成太多要测试的排列
最后还有一个棘手的安全策略问题。如果用户仅限于根据其部门或工作角色查看数据子集,则需要复制这些规则。在这种情况下,通过自动应用策略是一个真正的好处
所有这些都可能让你得出结论,最好的解决方案是让你的用户购买现成的产品。尽管这种方法本身也存在问题。临时报告是一种古老的宠儿。它经常作为一行出现在报告要求部分的末尾:“用户必须能够定义和运行自己的报告”。唯一的障碍是临时报告本身就是一个应用程序
你说
“将向用户显示一个
中存在的一组列
数据库中的不同表。”
如果预先选择并严格控制“一串列”(以及表的排列),您可以避免我在下面讨论的一些复杂性。唉,由于临时报告的性质,用户几乎需要所有表中的所有列
让我们从你的例子开始。用户已选择了col11
和col22
,因此需要生成此查询:
SELECT tabl1.col11
, tabl2.col22
FROM tabl1 JOIN tabl2
ON (TABL1.ID = TABL2.FKTABL1)
/
那不太难。您只需浏览数据字典视图USER\u CONSTRAINTS
和USER\u CONS\u COLUMNS
,即可在联接条件中建立列-前提是您已定义外键(请