2015-06-16 85 views
4

我需要使用其他SQL命令执行DDL命令(CREATE TABLE)。看到下面的代码片段:使用DashDB(DB2)在复合SQL中执行DDL

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命令。

事情是,我需要一次执行两个命令。有任何想法吗?

回答

3

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

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

它的工作原理,但一些奇怪的事情正在发生。如果我在'BEGIN'-END'块中使用'EXECUTE IMMEDIATE',它会正确创建表格。但是,如果在'BEGIN''END'块中放入'EXECUTE IMMEDIATE'和'INSERT'命令,我会收到以下错误:''“SCHEMA.test”是一个未定义的名称。SQLCODE = -204, SQLSTATE = 42704,DRIVER 3.66.46'。我想也许,出于某种原因,它试图首先执行'INSERT'。没有意义。 – matheusr

+0

那么,为了编译'INSERT'语句,DB2需要访问要插入的表的目录信息,并且该表显然不存在。为了避免这种情况,你需要动态地执行'CREATE'和'INSERT'。 – mustaccio

+0

就是这样,谢谢你,先生!我使用'EXECUTE IMMEDIATE'执行了'INSERT'命令。最终结果在这里http://pastebin.com/BNT9hVVd – matheusr