我想从一个过程调用create table / alter table命令。有可能吗?
我的要求是更改所有表中列的数据类型。所以,我只是从user_tab_cols
获取列名。现在我想创建一个需要create语句的临时表..但是我无法在proc中使用它。
有人可以帮帮我吗?
答案 0 :(得分:11)
我从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;
请注意,通常的限制适用:新数据类型必须与现有数据类型兼容(除非列为空),并且某些特定数据类型(如CLOB)的操作会比较棘手。
修改强>
我没有解决CREATE TABLE语句。原则是相同的,输出时间更长。此外,我并不完全清楚它是如何适用于您之前更改这些列的数据类型的要求。
答案 1 :(得分:0)
您可以将查询生成为字符串,并使用'exec'关键字执行它。