Teradata JDBC 创建临时表错误3585

4
我以前从未使用过Teradata JDBC驱动程序,所以我可能遇到了一些非常明显的问题...基本上,我正在尝试创建一个临时表,然后对其进行查询。
问题:
1.也许我不能像这样运行CREATE VOLATILE TABLE语句...我做错了什么?
2.也许驱动程序版本太旧了?(目前为12.00.00.110)
Java代码:
PreparedStatement  pstmtCreateVT = dbConn.prepareStatement(util.getQuery("CREATE_VOLATILE_TABLE_ABC"));
   pstmtCreateVT.setInt(1, 7);
   pstmtCreateVT.setInt(2, 11);
   pstmtCreateVT.executeQuery();

Query.properties

CREATE_VOLATILE_TABLE_ABC = \
CREATE VOLATILE TABLE ABC \
AS ( SELECT DISTINCT t1.NAME \
  , lookup.price \
FROM SUPERMARKET.FRUITS t1 \
  INNER JOIN SUPERMARKET.PRICING lookup \
    ON 
      lookup.price BETWEEN ? AND ? \
) \
WITH DATA NO PRIMARY INDEX \
ON COMMIT PRESERVE ROWS ;

错误

2013-11-15 09:55:19,220 DEBUG [CreatePoolingConnection.createConnection:102] url: jdbc:teradata://<<some_url_here>>/DATABASE=SUPERMARKET,ENCRYPTDATA=ON,TMODE=ANSI
2013-11-15 09:55:19,673 ERROR [BOMPartsApplicability.fetch:245] ERROR:
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata Database] [TeraJDBC 12.00.00.110] [Error 3585] [SQLState HY000] USING modifier NOT allowed with DDL.
   at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:277)
   at com.teradata.jdbc.jdbc_4.statemachine.ReceiveInitSubState.action(ReceiveInitSubState.java:102)
   at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.subStateMachine(StatementReceiveState.java:285)
   at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:176)
   at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:108)
   at com.teradata.jdbc.jdbc_4.statemachine.StatementController.run(StatementController.java:99)
   at com.teradata.jdbc.jdbc_4.Statement.executeStatement(Statement.java:309)
   at com.teradata.jdbc.jdbc_4.Statement.prepareRequest(Statement.java:467)
   at com.teradata.jdbc.jdbc_4.PreparedStatement.<init>(PreparedStatement.java:53)
   at com.teradata.jdbc.jdbc_4.TDSession.createPreparedStatement(TDSession.java:506)
   at com.teradata.jdbc.jdbc_3.ifjdbc_4.TeraLocalPreparedStatement.<init>(TeraLocalPreparedStatement.java:84)
   at com.teradata.jdbc.jdbc_3.ifjdbc_4.TeraLocalConnection.prepareStatement(TeraLocalConnection.java:328)
   at com.teradata.jdbc.jdbc_3.ifjdbc_4.TeraLocalConnection.prepareStatement(TeraLocalConnection.java:149)
   at GroceryStore.SetupFruits.fetch(BOMPartsApplicability.java:147)
   at GroceryStore.SetupFruits.main(BOMPartsApplicability.java:359)

你确定你能使用占位符执行DDL语句吗? - Przemyslaw Kruglej
好的呼叫(我知道我在做一些愚蠢的事情) - user1766760
1个回答

4

在使用PreparedStatement执行DDL语句时,似乎无法指定占位符(我刚刚尝试使用带有占位符的DDL创建了一个简单的表格来重现您的问题)。


是的,我成功运行了查询,通过去掉占位符并更改为 executeUpdate()。也许在这种情况下使用 PreparedStatement 没有意义? - user1766760
@user1766760 它真的取决于您的需求。如果您确定在您的情况下不存在注入攻击,则可以将参数连接到查询中(一般而言,这不是一个好方法)。 - Przemyslaw Kruglej
我习惯于使用占位符,没有意识到在DDL语句中不能使用它。但是似乎字符串拼接是不可避免的(如果我不使用存储过程之类的东西)。 - user1766760
@user1766760 很遗憾,即使您使用了存储过程,您仍然需要将参数拼接到查询语句中... EXECUTE IMMEDIATE 也不能在这里使用占位符,就像从Java中一样是不可能的。我刚刚检查了一下,EXECUTE IMMEDIATE 也不允许我使用占位符。 - Przemyslaw Kruglej
1
我知道这是一个老话题,但在这种情况下,我建议首先使用“NO DATA”和固定参数创建易失性表,然后(在同一连接上)将插入/选择操作执行到易失性表中。 - Insac

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