Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перенос исходников пакета из одной схемы в другую / 8 сообщений из 8, страница 1 из 1
28.05.2003, 13:00:25
    #32170572
ramasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос исходников пакета из одной схемы в другую
Добрый день.
Есть несколько шаблонных схем и десятки рабочих. Хочу написать пакет для синхронизации объектов шаблонных схем с рабочими. В первую очередь интересует синхронизация пакетов (тригеры, процедуры). Я знаю что исходники лежат в sys.dba_source. Но как это все прочитать и вставить в рабочую схему и скомпилировать на PL/SQL?
Спасибо за любые идеи.
...
Рейтинг: 0 / 0
28.05.2003, 13:09:43
    #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
28.05.2003, 13:11:42
    #32170600
Fedorchenko Aleksey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос исходников пакета из одной схемы в другую
Забыл добавить, что код работает на Oracle8i и выше. Реально же использую его на 9i
...
Рейтинг: 0 / 0
28.05.2003, 13:13:33
    #32170604
Angel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос исходников пакета из одной схемы в другую
Если правильно понял вопрос, то можно воспользоваться PL/SQL Developer - ом. Tools -> Compare User Objects.
...
Рейтинг: 0 / 0
28.05.2003, 13:18:34
    #32170618
Fedorchenko Aleksey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос исходников пакета из одной схемы в другую
Сравнивать схемы хорошо, но толку? Так взял и получил скрипт создания всех текущих пакетов. Остается потом запустить его на остальных базах и будет счастье :)

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

ЗЫ
Спасибо за пакет. При переходе на следующую версию обязательно воспользуюсь :)
...
Рейтинг: 0 / 0
28.05.2003, 14:19:58
    #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
28.05.2003, 18:05:31
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перенос исходников пакета из одной схемы в другую / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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