sql - 从 SQL 存储过程创建/更改

标签 sql oracle stored-procedures plsql

我想从过程中调用 create table/alter table 命令。是否可以?

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

任何人都可以帮我吗?

最佳答案

我从对 USER_TAB_COLUMNS 的引用推测这是甲骨文。 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 语句。原理是一样的,就是打出来的时间长了点。此外,我并不完全清楚它如何适用于您之前更改这些列的数据类型的要求。

关于sql - 从 SQL 存储过程创建/更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1999460/

相关文章:

mysql - 从 Rails 4.1 的 `:distinct` 中删除弃用的 `Relation#count` 选项

sql - INSERT INTO 存储过程的输出

postgresql - 在 PostgreSQL 中创建一个永不回滚的存储过程?

mysql - 在 db_query 正则表达式中使用连字符/破折号

sql - 如何选择每种类型的最大值

sql - 如何使用 row_number 和分区依据查找重复值

database - Oracle 不区分 null 和空字符串?

c# - SQL 服务器 : variable length XML storage

具有单个日期和日期范围的 SQL 条件 where 子句

mysql - 在mysql中使用存储过程插入日期维度日期时出错