2010-01-04 130 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