我想從過程調用create table/alter table命令。可能嗎?從SQL存儲過程創建/更改
我的要求是更改所有表中列的數據類型。所以,我只是從user_tab_cols
獲得專欄名稱。現在我想創建一個需要創建語句的臨時表..但我無法在proc中使用它。
任何人都可以幫我嗎?
我想從過程調用create table/alter table命令。可能嗎?從SQL存儲過程創建/更改
我的要求是更改所有表中列的數據類型。所以,我只是從user_tab_cols
獲得專欄名稱。現在我想創建一個需要創建語句的臨時表..但我無法在proc中使用它。
任何人都可以幫我嗎?
我推測參照USER_TAB_COLUMNS
這是Oracle。 ALTER
和CREATE
語句是DDL,我們不能直接在PL/SQL中執行。不過,這種限制有幾種方法:EXECUTE IMMEDIATE
和DBMS_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語句。原理是一樣的,只是輸出時間更長。此外,我不完全清楚它是如何適用於您先前要求更改這些列的數據類型。
謝謝..我用那一個..和它的工作絕對好。 非常感謝 – 2010-01-04 14:48:47
如果你正在使用它並且它正在工作,請將答案標記爲已接受(點擊左邊的大檢查使其變爲綠色)。 – 2010-01-04 15:33:38
您可以將查詢生成爲字符串並使用'exec'關鍵字執行它。
'exec'是SQL * Plus,而不是PL/SQL – 2010-01-05 14:36:34
OP最初沒有提到Oracle。一個足夠有知識的人可以從'user_tab_columns'的存在推斷它,但這個答覆是無辜的。 – Dan 2010-01-05 22:46:41
無辜,但不是很有幫助:) – 2010-01-06 12:07:25
mssqlserver? MySQL的? – spender 2010-01-04 13:18:54
在Oracle中,不需要即時創建臨時表。您應該考慮使用全局臨時表 - 它只創建一次,但每個會話都可以像使用它自己的專用副本一樣使用它(並且會話結束時自動清除其中的數據(或在提交時,如果你更喜歡))。 – 2010-01-06 12:06:36