首先,一个前言:我正在编写一个 java 类,它使用 jdbc 在数据库上创建临时表。我使用 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 对象为我做这件事,除了丢失所有其他好处。
我调查了其他解决方案,但到目前为止,没有一个能说服我:
我可以先创建一个空的 temp_table,然后用 INSERT INTO temp_table(id, column1) (SELECT ...) 填充它,但似乎我可能会导致性能损失,所以我想坚持 CREATE temp_table AS
我考虑过创建一个临时语句来保存内部 SELECT 查询,并让它生成格式正确/本地化/等。查询字符串,但我还没有找到任何方法从中获取最终查询(我读到这里绝对不可能)。我在这种情况下找到的唯一选择是使用DebuggableStatement,但我不确定我是否可以将它包含在项目中(而且,这似乎是解决我的问题的一种非常不雅的方式)
我正在考虑的另一个解决方案是简单地将创建临时表的查询(对于它们中的每一个我将整个 CREATE AS (SELECT...) 放在数据库中的一个过程中,我将然后可以使用 CallableStatement 调用。这样我可以避免处理类型化并且仍然具有良好的性能,但代价是与数据库的耦合更紧密(我必须确保程序在那里,或者在 java 中管理它们的添加/从数据库中删除)
所以,我的问题是:有没有比我能想到的更好的选择?