2016-02-16 2 views
0

Это просто, у меня есть база данных, которая содержит много таблиц, и я хочу добавить значение по умолчанию ко всем полям, которые представляют собой логические (char (1 байт)). Итак, есть ли способ (с помощью функции) написать некоторую логику, которая использует метаданные базы данных и ее таблиц, чтобы добавить это значение по умолчанию без повторения вручную в каждом поле в каждой таблице?Изменение метаданных базы данных

Надежда это ясно, ребята :)

+0

Вы имеете в виду [что-то вроде этого] (http://stackoverflow.com/a/2446009/ 266304), но изменяя значение по умолчанию вместо типа данных? Или вы хотите динамически выполнять инструкции alter, [более как это] (http://stackoverflow.com/questions/7825167/how-to-loop-through-columns-with-pl-sql/7825273#7825273) (но не падать, очевидно)? –

ответ

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; 
+0

Спасибо большое! Я думаю, это будет трюк! Это работает на оракуле? Две вещи, которые я не понимал, это НЕМЕДЛЕННО и ЧР (39) (, почему 39?) Еще раз спасибо. –

+0

1) Оператор EXECUTE IMMEDIATE выполняет динамический оператор SQL или анонимный блок PL/SQL 2) CHR (39) - символ одиночной кавычки '- значение ASCII одинарной кавычки –

+0

Отлично! Вы думаете, что это можно использовать для создания поля обновления, которое я только что изменил, чтобы установить старые значения с установленным значением по умолчанию? (что-то вроде, если значение поля не равно нулю, тогда вставьте 'Y') Извините, если не ясно (я новичок в oracle и sql) –

Смежные вопросы