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

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

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

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

Просить админа накатывать дамп очень нежелательно, на базе есть какие-то наработки/разработки разработчиков других модулей.
В крайнем случае можно открыть IDEшку в два окна, и через копировать/вставить/скомпилировать восстановить все пакеты.
Если автоматизировать не получится, то буду восстанавливать руками.
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #39730415
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходники нужно хранить в виде скриптов, а не в БД.
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #39730416
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNOСклеить куски тела пакета с помощью функции listaggНу-ну.
IMNOнакатывать дамп выбрать только определенные типы объектов. Если сервера не изолированы сетью, делается в несколько plsql-строк.
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #39730419
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicИсходники нужно хранить в виде скриптов, а не в БД.
Ах да, забыл написать про контроль версий.
Пакеты очень древние.
Контроль версий имеется, но конкретно свежих версий дропнутых пакетов там нет.
Есть какое-то старьё написанное ещё на SQL Server 2007. На этом всё.
Собственно почему я и хочу восстанавливать из другой базы.
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #39730469
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp[dp]/imp[dp]
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #39730533
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #39730547
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNOНемного поправить файлы руками, и готово.
Но без файлов
...
Рейтинг: 0 / 0
Восстановление пакетов с другой базы
    #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
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Восстановление пакетов с другой базы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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