powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как "распарсить" пакет?
24 сообщений из 49, страница 2 из 2
Как "распарсить" пакет?
    #32953644
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55Если 9i, то есть еще пакет dbms_metadata, может покопаться с ним, типа

Код: plaintext
1.
2.
3.
-- (тип объекта, имя объекта, хозяин)
SELECT dbms_metadata.get_ddl('PACKAGE', 'PKG1', 'HR2') AS Ddl 
FROM dual

PS Но, конечно, не в графическом виде

Выдает метаданные только на весь пакет целиком, сам могу
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953651
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoasterИзобретаем велосипед?)))))))))
Очертания уже похожи, только вот колеса пока треугольные)))

Объясните тупому - ПОЧЕМУ?!!! НУ ПОЧЕМУ?! Вы не хотите стандартные средства использовать? Ну не пользуетесь вы VCS'ами, ну хотя бы взять навигатор или тоад или другую софтину различную и сделать compare . . .

И что мне с этого cоmpare? Нафига мне знать что в пакете есть изменения с 300099 строки? Что я должен буду делать дальше с этой полезной информацией?
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953656
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KettlerДля парсинга обычно используют регулярные выражения.
В 9ке OWA_PATTERN или можно Java classов подгрузить.
Имхо без них никак :)

Буду признателен за более подробный рассказ
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953657
val-demar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoytИ что мне с этого cоmpare? Нафига мне знать что в пакете есть изменения с 300099 строки? Что я должен буду делать дальше с этой полезной информацией?

Навигатор покажет,что изменилось.
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953664
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slywebmasterесть еще Oracle Change Management Pack для сравнения различных объектов на разных бд

Только в нем к сожалению нет такой функции замечательной "показать в пакете PP измененные функции со вчершнего вечера", а факт того что изменен именно пакет для меня не несет никакой смысловой нагрузки
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953666
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
val-demar Voyt
нет такого типа 'PACKAGE_BODY'

Чуток ошибся Хм... Если ошиблись, тогда почему использовали оператор like?
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953669
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
val-demar VoytИ что мне с этого cоmpare? Нафига мне знать что в пакете есть изменения с 300099 строки? Что я должен буду делать дальше с этой полезной информацией?

Навигатор покажет,что изменилось.

Только у меня в системе 200 пакетов и 10000 функций в них, а также патологически глубокая вложенность вызовов. Посему изучать глазами - легче и вправду систему перетестить
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953699
val-demar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99 val-demar Voyt
нет такого типа 'PACKAGE_BODY'

Чуток ошибся Хм... Если ошиблись, тогда почему использовали оператор like?
А почему собственно говоря и не like ?
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953710
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
val-demar
А почему собственно говоря и не like ?

Да можно, конечно и like, только мою проблему это ну никак не решает
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953843
Stax.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Voyt

Если решите сами писать,
то не забывайте что программеры люди творческие,
в какой из f1 поменял ?
Код: 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.
declare
 function f1 return number is
 begin
   return  1 ;
 end;
 function f1(n number) return number is
 begin
   return  2 ;
 end;
 function f1(n date) return date is
 begin
   <<f1>> 
   declare
     function f1(n number) return number is
     begin
      return  5 ;
     end;
   begin
     null;
     return sysdate+f1( 1 );
   end f1;
   return null;
 end f1;
begin
  dbms_output.put_line(f1(d));
end;
SQL> /
 15 . 03 . 05 

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953852
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax.2 Voyt

Если решите сами писать,
то не забывайте что программеры люди творческие,
в какой из f1 поменял ?


Не наблюдаю проблемы определить f1 Наблюдаю проблему как получить текст f1
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953868
val-demar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Voyt
Не наблюдаю проблемы определить f1 Наблюдаю проблему как получить текст f1

Проблема, определить где заканчивается текст искомой процедуры.
Начало определить можно по имени и параметрам. Конец текста, не содержащий ни имени, ни комментария (то есть никакой связи с исходными данными)определить остается проблематично.
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953881
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
val-demar
Проблема, определить где заканчивается текст искомой процедуры.


Вероятно там где начинается текст другой. Что делать со вложенными - вот это действительно вопрос, но мои разработчики их почему то не используют
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953915
val-demar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Voyt
Вероятно там где начинается текст другой.
Проблем бы тогда не было. А если она последняя в пакете ?
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953954
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
val-demar Voyt
Вероятно там где начинается текст другой.
Проблем бы тогда не было. А если она последняя в пакете ?

Тогда за ней больше ничего нет. Меня бы это полностью устроило
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32953965
sataneyeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в частном случае (в комментариях нет бегинов/эндов, функции не предопределяются вначале пакетов, энд всегда end; и т.п.) такое сработает
можно еще с аналитическими функциями помутить
Код: 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.
DECLARE
   v_owner       VARCHAR2 ( 30 )  := 'SYS';
   v_proc        VARCHAR2 ( 255 ) := 'procedure SQL_DDL';
   v_name        VARCHAR2 ( 30 )  := 'STANDARD';
   v_line        NUMBER;
   begin_count   NUMBER         :=  0 ;
BEGIN
   SELECT line
     INTO v_line
     FROM dba_source
    WHERE TYPE = 'PACKAGE BODY'
      AND owner = v_owner
      AND NAME = v_name
      AND text LIKE '%' || v_proc || '%';

   FOR rc IN (SELECT   LOWER (text) text
                  FROM dba_source
                 WHERE TYPE = 'PACKAGE BODY'
                   AND owner = v_owner
                   AND NAME = v_name
                   AND line >= v_line
              ORDER BY line)
   LOOP
      DBMS_OUTPUT.put_line (rc.text);

      IF INSTR (rc.text, 'begin') >  0 
      THEN
         begin_count := begin_count +  1 ;
      END IF;

      IF INSTR (rc.text, 'end;') >  0 
      THEN
         begin_count := begin_count -  1 ;

         IF begin_count =  0 
         THEN
            RETURN;
         END IF;
      END IF;
   END LOOP;
END;
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32954057
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sataneyeffв частном случае (в комментариях нет бегинов/эндов, функции не предопределяются вначале пакетов, энд всегда end; и т.п.) такое сработает
можно еще с аналитическими функциями помутить


Согласен, а если название процедуры/функции стоит не в одной строке со словом PROCEDURE/FUNCTION?
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32954189
Kettler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаем Применение хранимых процедур Java в Oracle 8i
Читаем доку по регулярным выражениям.

Я бы сделал например так:
1. Удаляем все комментарии из package body
2. -//- литералы (то что в ' ' и в " ")
3. тогда возможны шаблоны
"(procedure.+?end;)\s+procedure"
"(procedure.+?end;)\s+function"
"(function.+?end;)\s+procedure"
"(function.+?end;)\s+function"
"(procedure.+?end;)\s+end;"
"(function.+?end;)\s+end;"

и т.д.
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32954208
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХO придется писать конвейерную функцию
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32954302
Stax.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KettlerЧитаем Применение хранимых процедур Java в Oracle 8i
Читаем доку по регулярным выражениям.

Я бы сделал например так:
1. Удаляем все комментарии из package body
2. -//- литералы (то что в ' ' и в " ")
3. тогда возможны шаблоны
"(procedure.+?end;)\s+procedure"
"(procedure.+?end;)\s+function"
"(function.+?end;)\s+procedure"
"(function.+?end;)\s+function"
"(procedure.+?end;)\s+end;"
"(function.+?end;)\s+end;"

и т.д.
убираем "неудобные" end;
Код: plaintext
1.
2.
3.
4.
5.
select *
into v 
from dual 
where 'X'=case when dummy='X' then 'X' end;
/

Заменяем перевод строки (склеиваем end и ;)

Убираем нехорошие function

И тестируем, тестируем,тестируем,тестируем ...
для версий напр 8 1 6
Код: 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.
declare
 v_end number;
 v_begin varchar2( 10 );
 cursor c1 is select dummy function from dual function;
 function f1 (function number)
   return number is
 begin
  <<f1>>
  begin
    null;
  end f1;
  select 'end;' as "procedure"
  into v_begin 
  from dual function ;
  execute immediate 'begin null;'||v_begin;
  return v_end;
 end
 ;
 function 
  f1(d varchar2 :='function f1') 
 return number is
 begin
  execute immediate 'select dummy from dual end' into v_begin ;
  return v_end;
 end f1;
begin
 v_end:=f1(sysdate);
end;
/

а конвеер все длиннеее,
а тестировщики пьют кофе и балдеют
Красиво жить не запретишь

Оно Вам надо
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #32954333
Фотография Voyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax.а конвеер все длиннеее,
а тестировщики пьют кофе и балдеют
Красиво жить не запретишь

Оно Вам надо

Что это было
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как "распарсить" пакет?
    #39329798
Тимурр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось решить задачу с парсером хринимки из пакета?
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #39329821
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимурр,

ага, вот щяз прям автор не заходивший на форум лет 8 проснётся и прибежит тебе отвечать.
зы. оно не надо было тогда. не надо и сейчас.
...
Рейтинг: 0 / 0
Как "распарсить" пакет?
    #39329831
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимурр,

19621564
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как "распарсить" пакет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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