我想从过程调用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