Java中执行SQL脚本的一般方法

9
这个问题讨论的功能是执行给定的SQL脚本。脚本内容旨在由用户在应用程序运行时定义。脚本可以是一个INSERT语句,也可以是一系列复杂的PL/SQL语句。由于输入在运行时可用(最终作为String实例),因此应该通过Java执行。
当前的方法是使用PreparedStatement包装用户输入并执行它。这种解决方案适用于现有的测试用例。主要问题是提供所使用的数据库的完整功能,这可能没有被测试覆盖,即提供与将相同的用户SQL脚本传递到数据库供应商提供的控制台最接近的解决方案。
我想知道当前使用PreparedStatement的方法是否存在任何未预见的限制?是否有更好的通用方法来通过Java执行SQL脚本?

你到底想要做什么?你只是想要运行所有东西,还是试图创建类似于http://sqlfiddle.com/这样的东西? - Jon Heller
1
这里是否存在安全漏洞的问题?是否有足够的限制措施来防止脚本执行任何可能不受欢迎或危险的操作?(例如,通过数据库中用户的权限等)? - Steve Chambers
3
为什么要重复造轮子?只需提供Oracle SQL开发人员和适当权限的登录即可。 - Bohemian
@Bohemian 我明白你的意思,但请考虑到用户提供的脚本将以计划方式执行,并与应用程序报告相结合,因此给用户赋予适当权限的角色不是解决方案。 - Pavel
@Bohemian 理解这一点,这是业务需求,决定超出了我的责任范围,这种方法的情况由队友和经理考虑。 - Pavel
显示剩余4条评论
2个回答

4

好的,这是一个广泛的设计问题,但我认为可以采取以下几个步骤:

  • SQL脚本解析和识别:您需要能够检测到您所拥有的SQL脚本类型:PL/SQL、DML、DDL、CDL、TCL、由“;”分隔的多部分等。
  • 语句构建:对于每种类型的SQL脚本,您需要能够使用Java执行该语句。
  • 解析结果:您需要能够收集SELECT中返回的结果,并可选地返回函数或受影响/插入行数的参数。
  • 错误处理:当事情没有按预期工作时,您需要能够报告SQL脚本发生了什么。

请考虑:

  • 这似乎像是编写SQL客户端的程序。如果不是,请解释您想要做什么。不要将其用作普通应用程序中的连接层。它将非常低效且容易受到SQL注入攻击(这比仅转义逗号复杂得多)。
  • 您可能希望调用带有外部参数的函数或执行查询。
  • 这不包括用户界面功能,如语法突出显示、参数界面等...

已更新问题,@borjab 请考虑新版本的问题。 - Pavel
我建立了一个开源项目,它可以帮助完成上述许多步骤。它可以像SQL*Plus一样拆分语句,对语句进行分类以便知道如何处理它们,删除不必要的分号(有些语句需要分号,有些则不需要),并提供类似于SQL*Plus的反馈(例如,“合并了5行。”用于MERGE语句)。它全部使用PL/SQL编写,但应该可以从Java中调用。 - Jon Heller

0

PreparedStatement 的第一个限制是 - 你无法注册存储过程的 OUT 参数,你可能需要查看 CallableStatement 接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接