从SQL存储过程创建/更改

时间:2010-01-04 13:14:45

标签: sql oracle stored-procedures plsql

我想从一个过程调用create table / alter table命令。有可能吗?

我的要求是更改所有表中列的数据类型。所以,我只是从user_tab_cols获取列名。现在我想创建一个需要create语句的临时表..但是我无法在proc中使用它。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分: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;

请注意,通常的限制适用:新数据类型必须与现有数据类型兼容(除非列为空),并且某些特定数据类型(如CLOB)的操作会比较棘手。

修改

我没有解决CREATE TABLE语句。原则是相同的,输出时间更长。此外,我并不完全清楚它是如何适用于您之前更改这些列的数据类型的要求。

答案 1 :(得分:0)

您可以将查询生成为字符串,并使用'exec'关键字执行它。