powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перенос исходников пакета из одной схемы в другую
8 сообщений из 8, страница 1 из 1
Перенос исходников пакета из одной схемы в другую
    #32170572
ramasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Есть несколько шаблонных схем и десятки рабочих. Хочу написать пакет для синхронизации объектов шаблонных схем с рабочими. В первую очередь интересует синхронизация пакетов (тригеры, процедуры). Я знаю что исходники лежат в sys.dba_source. Но как это все прочитать и вставить в рабочую схему и скомпилировать на PL/SQL?
Спасибо за любые идеи.
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32170595
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На, пользуйся :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create or replace package SCHEMA_PKG
AUTHID CURRENT_USER 
is  
  procedure Packages(location in varchar2, filename in varchar2);
end;
/

grant execute on SCHEMA_PKG to public;


Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
create or replace package body SCHEMA_PKG
is
  max_text_len constant number :=  32767 ;
  NL_LF        constant varchar2( 2 ) := chr( 10 );

  spool_file   utl_file.file_type;

  procedure FileOpen(location in varchar2, filename in varchar2)
  is
  begin
    spool_file := utl_file.fopen(location, filename, 'w', max_text_len);
  exception
    when utl_file.INVALID_PATH then 
      RAISE_APPLICATION_ERROR(- 20001 , 'File location or name was invalid');
    when utl_file.INVALID_MODE then 
      RAISE_APPLICATION_ERROR(- 20001 , 'The open_mode string was invalid');
    when utl_file.INVALID_OPERATION then 
      RAISE_APPLICATION_ERROR(- 20001 , 'File could not be opened as requested');
    when utl_file.INVALID_MAXLINESIZE then 
      RAISE_APPLICATION_ERROR(- 20001 , 'Specified max_linesize is too large or too small');
  end;

  procedure FileClose
  is
  begin
    utl_file.fclose(spool_file);
  end;

  procedure FileWriteCLOB(clob_text in clob)
  is
    char_text varchar2( 32767 );
    clob_len  number;
    amount    number;
    offset    number :=  1 ;
  begin
    clob_len := dbms_lob.getlength(clob_text);
    while clob_len >  0 
    loop
      if clob_len > max_text_len then
        amount := max_text_len;
      else
        amount := clob_len;
      end if;
      char_text := dbms_lob.substr(clob_text, amount, offset);
      utl_file.put(spool_file, char_text);
      utl_file.fflush(spool_file);
      offset := offset + amount;
      clob_len := clob_len - amount;
    end loop;
  end;

  procedure Packages_DDL(is_body in boolean)
  is
    metadata_handle number;
    transfrm_handle number;
    clob_text       clob;
  begin
    metadata_handle := dbms_metadata.open('PACKAGE');

    transfrm_handle := dbms_metadata.add_transform(metadata_handle, 'DDL');
    dbms_metadata.set_transform_param(transfrm_handle, 'BODY', is_body);
    dbms_metadata.set_transform_param(transfrm_handle, 'SPECIFICATION', not is_body);
    dbms_metadata.set_transform_param(transfrm_handle, 'SQLTERMINATOR', true);

    loop
      clob_text := dbms_metadata.fetch_clob(metadata_handle);
      exit when clob_text is null;
      FileWriteCLOB(clob_text);
    end loop;

    dbms_metadata.close(metadata_handle);
  end;

  procedure Packages(location in varchar2, filename in varchar2)
  is
  begin
    FileOpen(location, filename);

    Packages_DDL(is_body => false);
    Packages_DDL(is_body => true);

    FileClose;   
  exception
    when others then dbms_output.put_line(SQLERRM);
  end;
end;
/


Говоришь ему по какому пути и с каким именем создать файл в который будут записаны все пакеты текущей схемы
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32170600
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить, что код работает на Oracle8i и выше. Реально же использую его на 9i
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32170604
Angel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно понял вопрос, то можно воспользоваться PL/SQL Developer - ом. Tools -> Compare User Objects.
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32170618
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сравнивать схемы хорошо, но толку? Так взял и получил скрипт создания всех текущих пакетов. Остается потом запустить его на остальных базах и будет счастье :)

ramasha
Если немного расширить мой пакет, то он сможет выгружать не только пакеты :) Посмотри доку по dbms_metadata - полезный пакет.
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32170683
ramasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Fedorchenko Aleksey
В Oracle 8.1.5 нет dbms_metadata.
Еще раз просмотрел док. нет его там :(

ЗЫ
Спасибо за пакет. При переходе на следующую версию обязательно воспользуюсь :)
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32170732
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот запрос вернет скрипты создания всех пакетов из текущей схемы. Перенаправь его в spool и получишь файл скрипта. Это конечно проще, чем тот мой пакет, но мне по душе все же больше нравится использование dbms_metadata :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select 
  case line 
    when  1  then 'CREATE OR REPLACE ' || text
    else text
  end
from 
  user_source
order by type, name, line;
...
Рейтинг: 0 / 0
Перенос исходников пакета из одной схемы в другую
    #32171216
ramasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу вашему вниманию предложить свой вариант решения который больше всего устраивает меня

1. Создаем процедуру(пакет) в шаблонной схеме

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create or replace procedure ReCreatePackage authid current_user is
v_cursorID integer;
v_blockStr dbms_sql.varchar2s;
v_blockStrEmpty dbms_sql.varchar2s;
v_count integer:=  0 ;
begin
  v_cursorID:= dbms_sql.open_cursor;
  for c1 in (select * from sys.dba_source where owner='OWNER' order by type, name, line)
  loop    
    if c1.line=  1  then
      if v_count >  0  then
        dbms_sql.parse(v_cursorID, v_blockStr, 1 ,v_count,false,dbms_sql.v7);
      end if;
      v_blockStr:= v_blockStrEmpty;  
      v_blockStr( 1 ):= 'create or replace ';
    end if;
    v_blockStr(c1.line+ 1 ):= c1.text;
    v_count:= c1.line+ 1 ;    
  end loop;  
  dbms_sql.close_cursor(v_cursorID);
exception
    when others then
      raise; 
end ReCreatePackage ;


2. Создаем job для схем которые требуют обновления

Достоинства
1. Работает начиная c Oracle8i
2. Нет промежуточного вывода в файл

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


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