2010-01-04 176 views
3

我想從過程調用create table/alter table命令。可能嗎?從SQL存儲過程創建/更改

我的要求是更改所有表中列的數據類型。所以,我只是從user_tab_cols獲得專欄名稱。現在我想創建一個需要創建語句的臨時表..但我無法在proc中使用它。

任何人都可以幫我嗎?

+0

mssqlserver? MySQL的? – spender 2010-01-04 13:18:54

+0

在Oracle中,不需要即時創建臨時表。您應該考慮使用全局臨時表 - 它只創建一次,但每個會話都可以像使用它自己的專用副本一樣使用它(並且會話結束時自動清除其中的數據(或在提交時,如果你更喜歡))。 – 2010-01-06 12:06:36

回答

11

我推測參照USER_TAB_COLUMNS這是Oracle。 ALTERCREATE語句是DDL,我們不能直接在PL/SQL中執行。不過,這種限制有幾種方法:EXECUTE IMMEDIATEDBMS_UTILITY.EXEC_DDL()。在下面的例子中,我將使用EXECUTE IMMEDIATE

begin 
    for lrec in (select table_name from user_tab_columns 
        where column_name = 'UNIVERSAL_COLUMN_NAME') 
    loop 
     execute immediate 'alter table '||lrec.table_name|| 
           ' modify UNIVERSAL_COLUMN_NAME varchar2(255)'; 
    end loop; 
end; 

注意平時的限制:新的數據類型必須與現有的數據類型兼容(除非該列是空的),事情是與一些specilaized數據類型一樣的CLOB棘手。

編輯

我還沒有解決的CREATE TABLE語句。原理是一樣的,只是輸出時間更長。此外,我不完全清楚它是如何適用於您先前要求更改這些列的數據類型。

+1

謝謝..我用那一個..和它的工作絕對好。 非常感謝 – 2010-01-04 14:48:47

+2

如果你正在使用它並且它正在工作,請將答案標記爲已接受(點擊左邊的大檢查使其變爲綠色)。 – 2010-01-04 15:33:38

0

您可以將查詢生成爲字符串並使用'exec'關鍵字執行它。

+0

'exec'是SQL * Plus,而不是PL/SQL – 2010-01-05 14:36:34

+0

OP最初沒有提到Oracle。一個足夠有知識的人可以從'user_tab_columns'的存在推斷它,但這個答覆是無辜的。 – Dan 2010-01-05 22:46:41

+0

無辜,但不是很有幫助:) – 2010-01-06 12:07:25