【问题标题】:Modify the metadata of a database修改数据库的元数据
【发布时间】:2016-02-16 08:53:20
【问题描述】:

这很简单,我有一个包含许多表的数据库,我想做的是为所有表示布尔值(一个字符(1 字节))的字段添加一个默认值。那么有没有办法(使用函数)编写一些逻辑,使用数据库及其表的元数据来添加默认值,而无需手动迭代每个表中的每个字段?

希望这很清楚,伙计们:)

【问题讨论】:

  • 您的意思是something like this,但是更改默认值而不是数据类型?或者您是否也想动态执行 alter 语句,more like this(但显然不会放弃)?

标签: database oracle metadata default-value


【解决方案1】:

使用下面给出的块来完成你的任务

DECLARE

LV_SQL VARCHAR2(4000);

  CURSOR C_GET_COLUMNS IS
    SELECT TABLE_NAME,COLUMN_NAME,NULLABLE,DATA_LENGTH,DATA_TYPE
      FROM USER_TAB_COLUMNS
     WHERE DATA_TYPE = 'CHAR'
       AND DATA_LENGTH = 1;

BEGIN

  FOR I IN C_GET_COLUMNS LOOP
      LV_SQL := 'ALTER TABLE '||I.TABLE_NAME||' MODIFY '||I.COLUMN_NAME||' '||I.DATA_TYPE||'('||I.DATA_LENGTH||') DEFAULT '||CHR(39)||'Y'||CHR(39);
      EXECUTE IMMEDIATE LV_SQL;
      LV_SQL := 'UPDATE '||I.TABLE_NAME||' SET '||I.COLUMN_NAME||' =  '||CHR(39)||'Y'||CHR(39)||' WHERE '||I.COLUMN_NAME||' IS NULL';
      DBMS_OUTPUT.PUT_LINE(LV_SQL);
      EXECUTE IMMEDIATE LV_SQL;
  END LOOP;

END;

【讨论】:

  • 非常感谢!我认为这会成功!这适用于甲骨文?我不明白的两件事是 IMMEDIATE 和 CHR(39)(,为什么是 39?) 再次感谢。
  • 1) EXECUTE IMMEDIATE 语句执行动态 SQL 语句或匿名 PL/SQL 块 2) CHR(39) 是单引号字符 '-- 单引号的 ASCII 值
  • 太棒了!你认为这可以用来做一个我刚刚修改的更新字段,以便将旧值正确设置为默认值? (类似于如果字段的值不为空,则插入一个'Y')对不起,如果不清楚(我是oracle和sql的初学者)
  • 您的意思是更新仅为 null 的列还是不具有您期望的值的列
  • 是的,我的意思是在完成更改表之后,我想循环数据(我刚刚更新的字段)并在我找到空值时插入一个“Y”(默认值),所以我这些字段将不再有 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多