【问题标题】:Executing DDL in compound SQL using DashDB (DB2)使用 DashDB (DB2) 在复合 SQL 中执行 DDL
【发布时间】:2015-06-16 18:49:29
【问题描述】:

我需要使用其他 SQL 命令执行 DDL 命令 (CREATE TABLE)。见下面的代码sn-p:

CREATE TABLE test AS
(
    SELECT duration AS NUM1
    FROM event 
    WHERE duration IS NOT NULL
) WITH NO DATA;

INSERT INTO test (   
    SELECT duration AS NUM1
    FROM  event 
    WHERE event_duration_tech IS NOT NULL   
);

我正在创建一个表,然后填充它。

如果我通过 JDBC 发送此代码,由于语句终止符 (;) 错误,它不起作用。

如果我用BEGINEND 包装它来创建复合SQL 块,它不起作用,因为DB2 不允许复合SQL 块上的DDL 命令。

问题是,我需要一次性执行两个命令。有什么想法吗?

【问题讨论】:

    标签: sql db2 dashdb


    【解决方案1】:

    你需要使用动态SQL来执行一些DDL语句:

    EXECUTE IMMEDIATE 'CREATE TABLE test AS (SELECT...'
    

    【讨论】:

    • 它有效,但发生了一些奇怪的事情。如果我在BEGIN-END 块中使用EXECUTE IMMEDIATE,它会正确创建表。但是,如果在BEGIN-END 块内我放置了EXECUTE IMMEDIATEINSERT 命令,我会收到以下错误:"SCHEMA.test" is an undefined name.. SQLCODE=-204, SQLSTATE=42704, DRIVER 3.66.46。我想也许出于某种原因,它试图首先执行INSERT。没有意义。
    • 好吧,要编译INSERT 语句,DB2 需要访问您要插入的表的目录信息,而该表显然不存在。为避免这种情况,您需要动态执行CREATEINSERT
    • 就是这样,谢谢先生!我使用EXECUTE IMMEDIATE 执行了INSERT 命令。最终结果在这里pastebin.com/BNT9hVVd
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多