powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Узнать имя пакета, в котором содержится тип record
17 сообщений из 17, страница 1 из 1
Узнать имя пакета, в котором содержится тип record
    #39956144
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас есть задача

сравнивать на совпадение всех типов "начисто развернутую схему" и "схему, получившуюся в результате наката на старую схему нового патча"


Все было хорошо, пока не появились типы record внутри пакетов.

Тогда код


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  FOR diff IN (select distinct name, type from
                     (select name, type, line, text from all_source where owner = 'PATCHED'
                       minus
                      select name, type, line, text from all_source where owner = 'ORIG')                      
              )
  LOOP
    err := err + 1;
    dbms_output.put_line('Unexpected  '||diff.type||': '||diff.name);
  END LOOP;

  FOR diff IN (select distinct name, type from
                     (select name, type, line, text from all_source where owner = 'ORIG' 
                       minus
                      select name, type, line, text from all_source where owner = 'PATCHED')
              )
  LOOP
    err := err + 1;
    dbms_output.put_line('Missing  '||diff.type||': '||diff.name);
  END LOOP;



стал нести ересь типа

Unexpected TYPE: SYS_PLSQL_20768_9_1
Unexpected TYPE: SYS_PLSQL_20768_DUMMY_1
Unexpected TYPE: SYS_PLSQL_20768_89_1
Missing TYPE: SYS_PLSQL_22040_9_1
Missing TYPE: SYS_PLSQL_22040_DUMMY_1
Missing TYPE: SYS_PLSQL_22040_89_1



Встал вопрос, как сделать так, чтобы по имени типа типа рекорд получить имя пакета, в котором он создан?



Здесь обсуждается похожая тема, но для Oracle 12, который multitenant. Мне нужно для single tenant Oracle 11 что-то придумать.

вот это:
Код: plsql
1.
SELECT OBJECT_NAME,SHARING FROM DBA_OBJECTS WHERE OBJECT_TYPE = 'TYPE' AND OBJECT_NAME LIKE 'SYS_PLSQL%' AND ROWNUM = 1;


хорошо, но
1) слишком глубоко, дженкинс до DBA_OBJECTS никто не пустит
2) не решает задачу "получить имя пакета, в котором определен этот тип"
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956165
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hawkmoon
Встал вопрос, как сделать так, чтобы по имени типа типа рекорд получить имя пакета, в котором он создан?
Ну узнаешь, а дальше что?
22123700
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956172
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

в all_types их нет.
Но это не мешает. Так как при этом они, эти типы есть в

SELECT * FROM ALL_OBJECTS where owner = 'ORIG' and object_type = 'TYPE';
они же есть в
select name, type, line, text from all_source

Этого достаточно, чтобы, получив

Код: plsql
1.
select hitrozhopiy_package_name(ao.???) FROM ALL_OBJECTS ao where owner = 'ORIG' and object_type = 'TYPE';


сделать минус между orig и patched, для решения моей задачи.

Они же отлично отображаются в разделе types софтины SQL Developer, видимо, через all_objects.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956175
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hawkmoon
в all_types их нет.
Ну так и не лезь дальше.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956190
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

иногда лучше молчать и казаться умным, чем сказать и развеять все сомнения.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956210
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hawkmoon,

Во-первых, по стартовому вопросу, вообще-то, Elic правильно намекает - чтобы не получать ошибок, вам просто надо исключить типы, которых нет в all_types.
Во-вторых, зачем вам это надо? Это Internal типы, для отслеживания изменений вам достаточно отслеживать изменения кода пакетов, а не этих внутренних типов.
В-третьих, есть специальная вью, которая все что нужно показывает: all_plsql_types /user_plsql_types.
(в старых версиях, насколько помню в самом имени SYS_PLSQL_XXXXXX_YY_ZZ, XXXXXX - было hex значением OID пакета)
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956224
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... а есть ещё и генерируемые на лету типы, вообще не связанные с хранимым кодом.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956243
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Elic
... а есть ещё и генерируемые на лету типы, вообще не связанные с хранимым кодом.
насколько я помню, их скрыли еще 11.2
Код: plsql
1.
2.
and (o.type# not in (1  /* INDEX - handled below */,
                      10 /* NON-EXISTENT */)

а у "дропнутых" устанавливался STIME в последний день 4712 года: "31.12.4712 23:59:59", до тех пор пока SMON реально не подчистит их из системных таблиц
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956245
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Hawkmoon,
Во-вторых, зачем вам это надо?


Вообще-то, я писал, зачем.
Мне надо сравнить, что все типы, которые есть в накате нашего продукта начисто, имеются и при накате патча со старой версии до новой.
Таким образом проверяется валидность патча. проверяется на самом деле ВСЕ - таблицы, колонки, индексы, вьюхи, типы, кострейнты, fk - все, что могли не включить в патч... проблема именно с типами.

xtender
Это Internal типы, для отслеживания изменений вам достаточно отслеживать изменения кода пакетов, а не этих внутренних типов.


это не значит, что за ними не надо следить. если их нету в all_types, но при этом они есть в all_objects where type=type и в all_source where type=type, (в последнем месте - в сильно замусоренном виде) - это решение странное.
Еще более странно, что в dbeaver их нет, а в Oracle SQL Developer - они есть.

xtender
В-третьих, есть специальная вью, которая все что нужно показывает: all_plsql_types /user_plsql_types.
(в старых версиях, насколько помню в самом имени SYS_PLSQL_XXXXXX_YY_ZZ, XXXXXX - было hex значением OID пакета)


Вот тут спасибо, посмотрю.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956246
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hawkmoon
это не значит, что за ними не надо следить
нет абсолютно никакого смысла за ними следить, изменения надо отслеживать в самих пакетах.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956247
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

к сожалению, ALL_PLSQL_TYPES в пролете.
https://docs.oracle.com/database/121/REFRN/GUID-509A6343-5882-4260-BAD0-DC6B2BDC8301.htm#REFRN-GUID-509A6343-5882-4260-BAD0-DC6B2BDC8301
мне нужно то же самое для Oracle 11.
смотрю вторую часть совета.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956253
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

у нас коробочный продукт, поддерживающий несколько СУБД.
Нам проще вообще отказаться от типа record в пользу типа object, и вместо

Код: plsql
1.
FETCH v_rs INTO v_currec;



писать

Код: plsql
1.
2.
        FETCH v_rs INTO v_currec.ae_id, v_currec.ae_type_id, v_currec.ae_objid, v_currec.ae_time_of_removal, 
                        v_currec.ae_version, v_currec.ae_ost_id, v_currec.ae_deploy_condition, v_currec.ae_ot_id, v_currec.type_list;



не, ну а че такого-то? Подумаешь, 200 лишних символов написать, рука не отсохнет.
Так и сделано в продуктиве сейчас. Но пахнет костылищем.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956255
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hawkmoon
Unexpected TYPE: SYS_PLSQL_20768_9_1
Unexpected TYPE: SYS_PLSQL_20768_DUMMY_1
Unexpected TYPE: SYS_PLSQL_20768_89_1
Missing TYPE: SYS_PLSQL_22040_9_1
Missing TYPE: SYS_PLSQL_22040_DUMMY_1
Missing TYPE: SYS_PLSQL_22040_89_1
выделенное это просто object_id исходного пакета в 11-й версии.

Но еще раз: вам не нужно их отслеживать. В 11-й версии их имена зависят от object_id пакета(в 12+ вообще генерируются), соответственно, практически всегда один и тот же тип на разных базах будет иметь разные имена. Ну и в довесок, 11-я версия уже протухла давно. В общем, ССЗБ
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956257
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hawkmoon
Нам проще вообще отказаться от типа record в пользу типа object
что за бред?

Hawkmoon
у нас коробочный продукт, поддерживающий несколько СУБД.
это тут причем?

Отслеживайте только то, что меняете сами. Не надо вам во внутренности оракла заглядывать.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956258
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender

В 11-й версии их имена зависят от object_id пакета(в 12+ вообще генерируются), соответственно, практически всегда один и тот же тип на разных базах будет иметь разные имена.

с этого мучения и начались

xtender
Ну и в довесок, 11-я версия уже протухла давно. В общем, ССЗБ

ага, заказчикам расскажите
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956271
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Так и запишем, фетчить курсор в переменную типа object или record - БРЕД.

Дискуссия перестает быть конструктивной.
...
Рейтинг: 0 / 0
Узнать имя пакета, в котором содержится тип record
    #39956291
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hawkmoon
xtender,

Так и запишем, фетчить курсор в переменную типа object или record - БРЕД.

Дискуссия перестает быть конструктивной.
интересно читаешь. Это не дискуссия. Если не хотите конструктивных советов, то топик закрываю.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Узнать имя пакета, в котором содержится тип record
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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