2012-01-01 37 views
0

在Oracle中,我們這樣做:DB2當X是變量時創建表X?

def TNAME=&1 
create table &TNAME (foo varchar(10)); 

如何做DB2等價?約束條件如下:

1. The create table statement is generated when TNAME is unknown 
2. The create table statement is in a file which cannot be modified 
3. Cannot create a temporary file with TNAME substituted by awk 
4. Essentially we want to pass in the table name at run time as an argument 

可能嗎?

回答

1

EXECUTE IMMEDIATE語句可以用於幾乎任何由BEGIN和END包圍的SQL塊,例如存儲過程或匿名複合語句。

CREATE PROCEDURE create_table_from_file(IN fileDir VARCHAR(1024), 
             IN fileName VARCHAR(128), 
             IN tabSchema VARCHAR(128), 
             IN tabName VARCHAR(128) 
             ) 
BEGIN 
DECLARE fh UTL_FILE.FILE_TYPE; 
DECLARE sqlStmt VARCHAR(32672); 
DECLARE currentLine VARCHAR(32672); 
DECLARE SQLCODE INTEGER DEFAULT 0; 
DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; 
DECLARE SQLSTATE1 CHAR(5) DEFAULT '00000'; 
DECLARE CONTINUE HANDLER FOR SQLSTATE 'ORANF' SET SQLSTATE1 = SQLSTATE; 

SET sqlStmt = 'CREATE TABLE ' 
    || CASE WHEN (NULLIF(tabSchema, '') IS NOT NULL) 
     THEN RTRIM(tabSchema) || '.' 
     ELSE '' END || tabName; 
CALL UTL_DIR.CREATE_OR_REPLACE_DIRECTORY('createTablePath', fileDir); 
SET fh = UTL_FILE.FOPEN('createTablePath', fileName, 'r'); 
loop1: LOOP 
    CALL UTL_FILE.GET_LINE(fh, currentLine); 
    IF SQLSTATE1 = 'ORANF' THEN -- NO DATA FOUND 
     LEAVE loop1; 
    END IF; 
    SET sqlStmt = sqlStmt || ' ' || currentLine ; 
END LOOP; 
EXECUTE IMMEDIATE sqlStmt; 
END 
@ 
+0

這是否解決了4個約束? ESP。有關將文件名作爲變量傳入的部分?我能找到的唯一方法是我自己的答案,我不確定立即執行是解決方案還是更好的解決方案。如果確實是解決方案,我會很樂意接受你的答案。謝謝:) – necromancer 2012-01-08 09:20:25

+0

我編輯了我的答案,以顯示存儲過程如何處理表名和DDL文件作爲參數。 – 2012-01-08 23:42:05

+0

嗯......這很複雜。這個答案比我的積極,它不依賴'sed'或Unix環境。它依賴於DB2文件I/O,而我則將文件機制放在DB2範圍之外。所有的說和做我仍然更喜歡我自己的答案,但由於存在利益衝突我接受你的答案,因爲它肯定是有效的:)這個筆記主要是讓讀者比較它和我的答案,然後再決定在實踐中做什麼(取決於他們是否擁有Unix環境)。 – necromancer 2012-01-09 00:02:02

0

我創建了一個包含文件abc

create table TNAME (foo varchar(10)) 

然後我做了,在Unix命令行:

sed s/TNAME/xyz/g abc | db2 

其創建的表在DB2中稱爲xyz因爲我想。謝謝。

+0

認爲upvoted和接受爲正確的; D – necromancer 2012-01-02 00:01:06