【问题标题】:Is there a way to alter many tables to add default values to a common column name?有没有办法改变许多表以将默认值添加到公共列名?
【发布时间】:2019-05-26 15:07:48
【问题描述】:

我们有一组 45 个表,它们带有一个公共列 {variety}。 需要为所有此类列设置默认值 {comedy}。

ALTER TABLE (SCHEMA.TABLE_NAME) MODIFY(VARIETY DEFAULT 'COMEDY')

会完成它,但我想知道是否有一种方法可以在 Oracle 11g 中创建一个 sql 脚本,它将架构中具有通用列名的所有表更改为通用默认值。

【问题讨论】:

  • 您可以遍历 user_tables 和 user_columns 以构建一个立即执行语句并在运行中运行它,无论表中是否存在您需要的列。如果架构不是您从中运行查询的架构,您将需要 all_tables 和 all_columns 的权限,并改用这两个表。

标签: sql oracle oracle11g


【解决方案1】:
DECLARE
    cnt NUMBER;
BEGIN
    FOR x IN (
        SELECT DISTINCT t.table_name 
        FROM user_tables t
            INNER JOIN user_tab_columns c ON c.table_name = t.table_name
    ) LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE (SCHEMA.' || x.table_name || ') MODIFY(VARIETY DEFAULT ''COMEDY'')';
    END LOOP;
END;

【讨论】:

  • 谢谢。我在期待以下(-+ case mod 等)时遇到 ORA-06550 '遇到选择。似乎第一个 SELECT 不是当时预期的...... ................................
  • 尝试使用我添加的括号(抱歉我没有环境可以尝试)还添加了列过滤器。
  • 是的,我明白了...非常感谢!!
  • 我会添加“where dropped = 'NO'”
【解决方案2】:

alter table 语句可以写成如下, 使用备用引用机制。

'alter table ' || x.table_name || q'[ modify (variety default 'COMEDY')]'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2014-05-13
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多