不能在 DDL 语句中使用绑定变量.选择



首先,前言:我正在编写一个使用 jdbc 在数据库上创建临时表的 java 类。我使用 JSE6 和 Oracle 11XE 作为测试数据库,但该类也需要符合 DB2。

我尝试创建的临时表来自一个更大的表,我对数据进行了一些筛选和聚合。我基于过滤的参数由用户在运行时决定。我正在尝试做的一个简化的例子是:

CREATE TABLE temp_table AS (
    SELECT
           table1.department_id,
           SUM(CASE WHEN table1.number_1 < &1 THEN table1.number_1 ELSE 0 END)) AS column1              
    FROM
           table1
    GROUP BY table1.department_id
)

我的问题是我需要指定参数来过滤数据,并且我需要确保它们被正确转义/本地化/类型化。使用预准备语句很容易,但我不能将绑定变量与 DDL 一起使用。我采用的临时解决方案是自己更改查询字符串,将参数写入正确的位置,但这意味着我现在必须实现所有检查,而不是依赖 PreparedStatement 对象为我完成检查,除了失去所有其他好处。

调查了其他解决方案,但到目前为止都没有说服我:

  1. 我可以先创建一个空temp_table,然后用插入到temp_table(id,列1)(选择...)填充它,但似乎我可能会遭受性能损失,所以我想坚持使用创建temp_table

  2. 我想创建一个临时语句来保存内部 SELECT 查询,并让它生成一个格式正确/本地化/等查询字符串,但我还没有找到任何方法可以从中获取最终查询(我读到这里绝对不可能)。在这种情况下,我找到的唯一选择是使用 DebuggableStatement,但我不确定我可以将其包含在项目中(此外,这似乎是一种解决我问题的非常不优雅的方式)

  3. 我正在考虑的另一个解决方案是简单地将创建临时表的查询(对于每个查询,我将整个创建为(选择...)放在数据库上,在一个过程中,然后我将能够使用 CallableStatement 调用该过程。 这样,我可以避免处理类型化,并且仍然具有良好的性能,代价是与数据库的耦合更紧密(我必须确保程序在那里, 或在 Java 中管理它们在数据库中的添加/删除)

所以,我的问题是:有没有比我能想到的更好的选择?

这应该是与数据库无关的,还是你只针对 Oracle? 您不必将 PL/SQL 存储在存储过程中即可使用它;只需构建一个匿名的PL/SQL块来执行您需要的操作,然后执行它。 匿名 PL/SQL 块可以动态构建,以便在 PL/SQL 中声明强类型变量来保存参数,然后 Java 代码将值粘贴进去。 类型安全不会由 Java 处理,因为你只是在构建一个字符串;当您执行匿名 PL/SQL 块时,它将由 Oracle 处理。

最新更新