Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java应用程序动态构建oracle sql查询_Java_Sql_Oracle_Dynamic - Fatal编程技术网

从java应用程序动态构建oracle sql查询

从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

如何从java应用程序动态构建oracle pl/sql查询?用户将看到数据库中不同表中的一组列。用户可以选择任何一组列,应用程序应该只使用包含所选列的表来构建完整的select查询。 例如,让我们考虑数据库中有3个表。用户选择col11、col22。在这种情况下,应用程序应仅使用Tabl1和Tabl2构建查询。 我如何做到这一点

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
,即可在联接条件中建立列-前提是您已定义外键(请