在一个查询java中执行一批DDL语句
Posted
技术标签:
【中文标题】在一个查询java中执行一批DDL语句【英文标题】:Executing batch of DDL statements in one query java 【发布时间】:2017-10-26 11:33:25 【问题描述】:我在一个字符串中查询了哪一批 sql 命令,
String SQLQuery =
"CREATE VOLATILE TABLE v1;
CREATE VOLATILE TABLE v2;
INSERT INTO v1;
//do stuff
INSERT INTO v2;
//do stuff
UPDATE xx;
//do stuff
DROP TABLE v1;
DROP TABLE v2;"
我尝试使用 executeUpdate() 执行它们,executeBatch() 两者都在 java jdbc 客户端失败,该客户端在 Teradata 客户端中工作。
Error mesg:
[TeraJDBC 15.10.00.35] [Error 3576] [SQLState 25000] Data definition not valid unless solitary.
Java 代码:
PreparedStatement stmt10 = null;
try
stmt10 = conn.prepareStatement(SQLQuery);
//stmt10.executeUpdate();
stmt10.executeBatch();
//conn.commit();
catch (Exception ex)
throw new Exception(ex.getMessage());
finally
if (stmt10 != null)
stmt10.close();
我该怎么做?
【问题讨论】:
executeBatch
是与addBatch
一起使用,发送一批命令一次执行。这应该是一个简单的 Statement
和 execute
我的东西
@AxelH 我也试过只是执行(),它失败并出现同样的错误
您可能会使用this answer 的变体,它使用SqlTool 来解析和执行SQL 命令文件。
【参考方案1】:
在 teradata 中,您不能一起执行 DDL 语句。这不是 JDBC 或 java 代码的问题 - 只是您想要使用 teradata 的方式。这就是那个错误的基本意思:
http://teradataerror.com/3576-Data-definition-not-valid-unless-solitary.html
因此,您需要在带有单独请求的单独事务中发送单独的 DDL 语句。如果是多次更新和选择,它会工作得很好,但不能像那样执行创建表。
我认为这是因为任何 DDL 请求都必须在实际发生之前提交。如果你这样使用它,它不是。我认为如果它只有一个并且它是最后一条语句,那么在多命令查询中使用 DDL 实际上是可以的。
【讨论】:
但我在 Teradata 客户端(如 Teradata Admin、Assistant)中执行了这些多条语句。效果很好,仅通过 jdbc 多个 DDL 语句不可执行 可能是客户端一一发送?我现在没有 teradata 来测试它到底是如何工作的以上是关于在一个查询java中执行一批DDL语句的主要内容,如果未能解决你的问题,请参考以下文章