Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Восстановление пакетов с другой базы / 8 сообщений из 8, страница 1 из 1
09.11.2018, 11:23
    #39730402
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
Здравствуйте.

В общем я немного накосячил и дропнул несколько пакетов с базы разработчиков.
Благо есть точно такая же база для тестировщиков.

Мне нужно восстановить пакеты. Пакетов около сотни.
Я могу заселектить тела пакетов из словаря User_Source.
Склеить куски тела пакета с помощью функции listagg, и выгрузить в формате csv через IDE(PL/SQL Developer).
Немного поправить файлы руками, и готово.
Но это какая-то полу-автоматизация.
Хотелось бы полностью автоматизировать процесс, чтобы не делать какие-либо действия руками.
Чтобы на выходе в каталоге у меня был список:
package_1.sql
package_2.sql
package_N.sql

1. Как это можно реализовать?
2. Может предложите ещё какие-нибудь пути восстановления пакетов с другой базы?

Просить админа накатывать дамп очень нежелательно, на базе есть какие-то наработки/разработки разработчиков других модулей.
В крайнем случае можно открыть IDEшку в два окна, и через копировать/вставить/скомпилировать восстановить все пакеты.
Если автоматизировать не получится, то буду восстанавливать руками.
...
Рейтинг: 0 / 0
09.11.2018, 11:36
    #39730415
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
Исходники нужно хранить в виде скриптов, а не в БД.
...
Рейтинг: 0 / 0
09.11.2018, 11:36
    #39730416
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
IMNOСклеить куски тела пакета с помощью функции listaggНу-ну.
IMNOнакатывать дамп выбрать только определенные типы объектов. Если сервера не изолированы сетью, делается в несколько plsql-строк.
...
Рейтинг: 0 / 0
09.11.2018, 11:38
    #39730419
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
ElicИсходники нужно хранить в виде скриптов, а не в БД.
Ах да, забыл написать про контроль версий.
Пакеты очень древние.
Контроль версий имеется, но конкретно свежих версий дропнутых пакетов там нет.
Есть какое-то старьё написанное ещё на SQL Server 2007. На этом всё.
Собственно почему я и хочу восстанавливать из другой базы.
...
Рейтинг: 0 / 0
09.11.2018, 12:21
    #39730469
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
exp[dp]/imp[dp]
...
Рейтинг: 0 / 0
09.11.2018, 13:17
    #39730533
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
...
Рейтинг: 0 / 0
09.11.2018, 13:48
    #39730547
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
IMNOНемного поправить файлы руками, и готово.
Но без файлов
...
Рейтинг: 0 / 0
09.11.2018, 14:41
    #39730601
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление пакетов с другой базы
Вячеслав Любомудровexp[dp]/imp[dp]
Пока гуглил про то, как пользоваться утилитами импорта и экспорта, наткнулся на dbms_metadat.get_ddl().

Написал два скрипта:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
DECLARE 
  v_pack CLOB;
BEGIN
  FOR pack IN(SELECT pack
              FROM Scheme_Two.DropedPacks)
  LOOP
    SELECT dbms_metadata.get_DDL('PACKAGE', pack.pack)
    INTO v_pack
    FROM DUAL;
    
    INSERT INTO Scheme_One.DropedPacks(pack)
    VALUES(v_pack);
  END LOOP;
  
  COMMIT;
END;

DECLARE
BEGIN
  FOR pack IN(SELECT pack
              FROM Scheme_One.DropedPacks)
  LOOP
    EXECUTE IMMEDIATE SUBSTR(regexp_replace(REPLACE(pack.pack, '"Scheme_Two"', 'Scheme_One'), 'Scheme_One\."([[:alnum:]_]{1,30})"', '\1'), 
                             1, 
                             INSTR(pack.pack, 'CREATE OR REPLACE PACKAGE BODY') - 15);                    
    EXECUTE IMMEDIATE SUBSTR(regexp_replace(REPLACE(pack.pack, '"Scheme_Two"', 'Scheme_One'), 'Scheme_One\."([[:alnum:]_]{1,30})"', '\1'), 
                             INSTR(pack.pack, 'CREATE OR REPLACE PACKAGE BODY') - 15);
  END LOOP;
END;



На той схеме(Scheme_Two), где пакеты присутствуют, создал таблицу с наименованиями(DropedPacks) дропнутых пакетов.
На той схеме, где пакеты отсутствуют, создал таблицу со столбцом типа CLOB для тел дропнутых пакетов.
В первом скрипте в сессии на Scheme_Two закачал тела пакетов в первую схему.

1. Перехожу в сессию на первую схему Scheme_One.
2. Во втором скрипте заменил наименование схемы в каждом пакете.
3. Заменил наименование пакетов на наименование без кавычек.
4. Разделил спецификацию и тело пакета. У меня почему-то спецификация и тело не компилировались в одном вызове.
5. 15 - это магическое число. После перекачки пакетов из одной схемы на другую появляются пробелы, которые мешают SUBSTR().
Природу этих пробелов мне выяснить не удалось.

Всем спасибо большое. Всё получилось.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Восстановление пакетов с другой базы / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]