2015-06-16 24 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