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
@
這是否解決了4個約束? ESP。有關將文件名作爲變量傳入的部分?我能找到的唯一方法是我自己的答案,我不確定立即執行是解決方案還是更好的解決方案。如果確實是解決方案,我會很樂意接受你的答案。謝謝:) – necromancer 2012-01-08 09:20:25
我編輯了我的答案,以顯示存儲過程如何處理表名和DDL文件作爲參數。 – 2012-01-08 23:42:05
嗯......這很複雜。這個答案比我的積極,它不依賴'sed'或Unix環境。它依賴於DB2文件I/O,而我則將文件機制放在DB2範圍之外。所有的說和做我仍然更喜歡我自己的答案,但由於存在利益衝突我接受你的答案,因爲它肯定是有效的:)這個筆記主要是讓讀者比較它和我的答案,然後再決定在實踐中做什麼(取決於他們是否擁有Unix環境)。 – necromancer 2012-01-09 00:02:02