【问题标题】:Teradata JDBC Create Volatile Table error 3585Teradata JDBC 创建易失性表错误 3585
【发布时间】:2013-11-29 06:01:37
【问题描述】:

我以前从未使用过 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 语句吗?
  • 好电话(我知道我在做蠢事)

标签: java sql jdbc teradata


【解决方案1】:

在我看来,如果您想使用 PreparedStatement 执行 DDL 语句,您无法为它们指定占位符(我刚刚重现了您的问题,试图在 DDL 中创建一个带有占位符的简单表)。

【讨论】:

  • 是的,我能够通过取出占位符并更改为 executeUpdate() 来运行查询。也许在这种情况下使用PreparedStatement 没有意义?
  • @user1766760 这真的取决于你需要什么。如果您确定在您的情况下不可能进行注入攻击,您可以将参数连接到您的查询(通常,这不是一个好方法)。
  • 我太习惯使用占位符了,没想到我不能在 DDL 语句中使用它。但似乎字符串连接是不可避免的(如果我不使用存储过程之类的东西)。
  • @user1766760 不幸的是,即使您使用存储过程,您仍然必须将参数连接到查询中...EXECUTE IMMEDIATE 不允许您在那里使用占位符,就像它一样Java不可能。我刚刚检查过了,EXECUTE IMMEDIATE 也不允许我使用占位符。
  • 我知道这是一个老话题,但在这种情况下,我建议首先使用“NO DATA”和固定参数创建易失性表,然后(在同一连接上)执行插入/选择到易变的。
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 2016-04-25
  • 2013-06-11
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2016-07-27
  • 2017-01-31
相关资源
最近更新 更多