пятница, 3 июня 2011 г.

Некоторые полезные процедуры для загрузки дампа

Не раз сталкивался с необходимостью загрузки данных в UNICODE базу выгруженых из не UNICODE базы. При этом требуется изменять ширину полей таблиц так как в UNICODE каждый символ занимает от одного до 4 байт.
Процедуры которые могут понадобиться для выполнения этой работы:

-- удалить данные из таблиц
DECLARE
l_str VARCHAR2(1000);
BEGIN
dbms_stats.gather_schema_stats(ownname => 'СХЕМА',cascade => TRUE);
FOR t IN (SELECT *
FROM all_tables t
WHERE t.owner = 'СХЕМА'
AND t.num_rows>0
ORDER BY t.table_name) LOOP
l_str := 'truncate table "'||t.owner||'"."'||t.table_name||'"';
-- dbms_output.put_line(l_str);
EXECUTE IMMEDIATE l_str;
END LOOP;
END;

-- отключить тригеры
DECLARE
l_str VARCHAR2(1000);
BEGIN
FOR t IN (SELECT *
FROM all_objects o
WHERE o.owner = 'СХЕМА'
AND o.OBJECT_TYPE = 'TRIGGER'
ORDER by o.OBJECT_NAME) LOOP
l_str := 'alter trigger "'||t.owner||'"."'||t.object_name||'" disable';
-- dbms_output.put_line(l_str);
EXECUTE IMMEDIATE l_str;
END LOOP;
END;

-- изменить задание ширины полей таблиц на символы с байт
DECLARE
l_str VARCHAR2(1000);
BEGIN
FOR t IN (SELECT tc.*
from all_tab_columns tc,
all_tables t
where t.owner = tc.OWNER
AND t.table_name = tc.TABLE_NAME
AND tc.OWNER = 'СХЕМА'
and DATA_TYPE in ('CHAR','VARCHAR2')
and tc.CHARACTER_SET_NAME = 'CHAR_CS'
and tc.CHAR_USED = 'B') LOOP --'C'

l_str := 'alter table "'||t.OWNER||'"."'||t.TABLE_NAME ||'" modify ("'||t.COLUMN_NAME||'" '||t.DATA_TYPE||'('||t.CHAR_LENGTH ||' char))';
-- dbms_output.put_line(l_str);
EXECUTE IMMEDIATE l_str;
END LOOP;
END;

-- создать публичные синонимы на все обьекты схемы данных
DECLARE
l_str VARCHAR2(1000);
BEGIN
FOR t IN (SELECT *
FROM all_objects o
WHERE o.owner = 'СХЕМА'
ORDER by o.object_type,
o.object_name) LOOP
l_str := 'create or replace public synonym "'||object_name||'" for "'||t.owner||'"".""'||o.OBJECT_NAME;
-- dbms_output.put_line(l_str);
EXECUTE IMMEDIATE l_str;
END LOOP;
END;

-- выдать привилегии на запуск всех программных элементов схемы
DECLARE
l_str VARCHAR2(1000);
BEGIN
FOR t IN (SELECT *
FROM all_objects o
WHERE o.OWNER='СХЕМА'
AND o.OBJECT_TYPE IN ('PACKAGE','PROCEDURE','FUNCTION')
ORDER BY o.OWNER,
o.OBJECT_NAME) LOOP
l_str := 'grant execute on "'||t.owner||'"."'||o.OBJECT_NAME||'" to ПОЛЬЗОВАТЕЛЬ';
-- dbms_output.put_line(l_str);
EXECUTE IMMEDIATE l_str;
END LOOP;
END;



Комментариев нет: