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

问题描述:

在这个问题中讨论的功能是执行给定的SQL脚本。脚本的内容旨在由用户在应用程序运行时期间定义。该脚本可以是一个INSERT语句或一系列复杂的PL/SQL语句。由于在运行时可用的输入(最终为String实例),它应该通过Java执行。在Java中执行SQL脚本的一般方法

当前的方法是用PreparedStatement包装用户输入并执行它。该解决方案适用于现有的测试用例。主要关心的是提供可能未被测试覆盖的已使用数据库的完整功能,即最接近将同一用户SQL脚本传递到数据库供应商提供的控制台的解决方案。

我想知道在PreparedStatement当前方法中有没有设想的限制吗?有没有更好的通过Java执行SQL脚本的一般方法?

+0

你究竟想要做什么?你想简单地运行一切,你想创建像http://sqlfiddle.com/? –

+1

安全漏洞在这里值得关注吗?是否有足够的限制来防止脚本做任何可能不需要或危险的事情? (例如,通过用户在数据库中的权限?) –

+0

@SteveChambers不存在漏洞问题,因为用户修改了自己的数据库并对其负责。主要关心的是以最有效的方式提供数据库的全部功能。 –

好了,这是一个广泛的设计问题,但我认为有可以做几个步骤:

  • SQL脚本解析和识别:你需要能够检测SQL的哪种类型你有脚本:PL/SQL,DML,DDL,CDL,TCL,多部分用“;”隔开等等
  • 声明建立:对于每种类型的sql脚本,您需要能够使用java执行语句。
  • 解析结果。您需要能够收集SELECT中返回的以及可选的函数返回的参数或受影响/插入行数。
  • 错误处理:当事情没有按预期工作时,您需要能够报告发生在SQL脚本上的情况。

请考虑:

  • 这似乎是一个SQL客户端的编程。如果不是,请解释你想做什么。不要将其用作普通应用程序中的连接层。这将是非常低效的,容易受到SQL注入的影响(这比复制逗号要复杂得多)
  • 您可能想要调用函数或使用外部参数执行查询。
  • 这不包括语法突出显示等用户界面功能。参数接口,等...
+0

执行问题更新@borjab请考虑问题的新版本 –

+0

我构建了一个[开源项目](https://github.com/jonheller1/plsql_lexer),可能有助于上述许多步骤。它可以分解类似于SQL \ * Plus的语句,对语句进行分类,以便您知道如何处理它们,移除不必要的分号(某些语句需要它们,有些则不需要),并提供类似于SQL \ * Plus的反馈。 “5行合并”,对于MERGE语句)。这些都在PL/SQL中,但应该可以从Java调用它。 –

,想到的PreparedStatement第一个限制 - 你将不能够注册一个存储过程的参数OUT(一个或多个),您不妨看看CallableStatement接口。