在一个查询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 一起使用,发送一批命令一次执行。这应该是一个简单的 Statementexecute 我的东西 @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语句的主要内容,如果未能解决你的问题,请参考以下文章

执行SQL语句的方式

SQLDataSet中执行DDL语句

关于数据库

Myslq基础之DML语句和DDL语句

如何查找MySQL中查询慢的SQL语句

MySQL入门