这是简单的元数据,我有一个包含许多表和我想做的事是默认值添加到所有代表一个布尔值(一个char(1个字节))领域的数据库。那么,有没有一种方法(使用函数)编写使用数据库及其表的元数据来添加默认值,而无需手动遍历每个领域中各表中的一些逻辑?修改数据库
希望这是明确的家伙:)
这是简单的元数据,我有一个包含许多表和我想做的事是默认值添加到所有代表一个布尔值(一个char(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;
非常感谢!我认为这将会诀窍!这对oracle有效? 两件事情我不明白的是立竿见影的,CHR(39)(,为什么39?)再次感谢 。 –
1)EXECUTE IMMEDIATE语句执行动态SQL语句或匿名PL/SQL块 2)CHR(39)是单引号字符' - 单引号的ASCII值 –
太棒了!你认为这可以用来做一个更新字段,我只是修改了旧值的默认值正确设置? (类似于如果该字段的值不为空然后插入'Y') 对不起,如果它不明确(我是oracle和sql的初学者) –
你的意思[这样的事情(http://stackoverflow.com/a/2446009/ 266304),但改变了默认值而不是数据类型?或者你想执行alter语句动态太多,[更多像这样的(http://stackoverflow.com/questions/7825167/how-to-loop-through-columns-with-pl-sql/7825273#7825273) (但显然不会下降)? –