|
|
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
Ребята, перерыл интернет на предмет наличия универсального способа обработки SYS_REFCURSOR. Наткнулся здесь, мол можно через pipelined (попробовал, но предопределение столбцов не устраивает), через ODCI - увы очень мало информации об этом и в основном на аглицком. А я с ним очень плохо дружу! Нужна помощь! Кто может сталкивался, кто что знает - буду рад любой информации! Собственно что я хочу: Код: plsql 1. 2. 3. Уже была тема , но там пользователь с ником dbms_photoshop написал dbms_photoshop1. Самый банальный способ - pipelined. Ищи в доке и гугле. 2. Самый универсальный - odcitable. Ищи в доке и гугле. 3. Самый извращенный - XML. Ищи в форуме. и больше ничего не говорил об этом. А меня именно заинтересовал второй способ!!! Все потом вертелось вокруг pipelined функции. Так как автора того поста это устраивало - на этом они и остановились. А я вот нехочу каждый раз предопределять параметры (ленивый я, да...) и хочу один раз написать процедурину или пакет и пользоваться им заменяя километровые коды описания временных таблиц или что еще хуже создание физических таблиц - двумя строчками! Может я плохо искал (вроде нет), может я неправильно задавал вопросы в гугле - но в результате я не смог пробиться дальше чем 3-4 основных моментов создания ODCI Table. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 12:34:26 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 12:51:46 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGB, В 99% случаев гонящиеся за суперуниверсальносьтю делают это либо из-за неправильного дизайна либо из-за неумения пользоваться инструментами. ODCITable весьма кривая штука, которая неявно создает типы SYS%== . С таким же успехом можно написать свой собственный велосипед, который будет генерить DDL. Я нашел применение этой технологии лишь раз - при выполнении MDX запросов к SSAS из Оракла, но это очень экзотический случай. Просто MDX в отличие от SQL может возвращать произвольное число столбцов так же как и строк. А, да, работает технология с точностью до хард парса. С реф курсорами будет вдвойне криво. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:01:12 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Очень рад что вы ответили! Быть может вы все-таки прольете свет на данную тему. Ведь я хочу как лучше! До этого работал в MS-SQL. Очень удобно там реализована функция временной таблицы. В PL-SQL эта же функция сопровождается (как минимум) описанием столбцов. Да, я не буду спорить на тему своего криворукогонеумелого кодинга и знания инструментов. Но хочется все же выпрямить свои рукинаучиться умело пользоваться инструментами, и разобраться в конце-концов (пусть и на своих же ошибках) как лучше выполнить ту или иную задачу. Я кстати не полностью описал то что я хочу (может кто-то конечно и догадался, но лишний раз думаю уточнить можно). На входе я имею неизвестный набор данных any_table. Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select. Не понимаю, почему такой способ не используется - ведь он был бы очень удобен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:18:16 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBНа входе я имею неизвестный набор данных any_table. Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select. Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.При переходе с MSSQL на Оракл надо смириться с тем, что тип результата надо определять. Процедура не может возвращать рекордсет совершенно различной структуры (иначе как через реф курсор или XML) в отличие от MSSQL. Можно долго холиварить на тему хорошо это или плохо, но это так и я считаю что это гуд. Хотя с другой стороны динамические языки типа перла, пайтона и скала, которые определяют типы на лету это тоже хорошо, но это из другой оперы. Возвращаясь к твоей проблеме, если набор данных возвращается на клиент применяй себе реф курсор, он для этого и создан. Если возвращаемый набор данных должен быть обработан в PL/SQL или использован как часть другого SQL запроса - возвращай его как SQL коллекцию. При этом создав столько коллекций сколько необходимо. Можно ограничиться какой-то универсальной со множеством полей. Все равно код так или иначе обрабатывает определенные поля рекодсета, не так ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:37:46 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopSerjantGBНа входе я имею неизвестный набор данных any_table. Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select. Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.При переходе с MSSQL на Оракл надо смириться с тем, что тип результата надо определять. Процедура не может возвращать рекордсет совершенно различной структуры (иначе как через реф курсор или XML) в отличие от MSSQL. Можно долго холиварить на тему хорошо это или плохо, но это так и я считаю что это гуд. Хотя с другой стороны динамические языки типа перла, пайтона и скала, которые определяют типы на лету это тоже хорошо, но это из другой оперы. Возвращаясь к твоей проблеме, если набор данных возвращается на клиент применяй себе реф курсор, он для этого и создан. Если возвращаемый набор данных должен быть обработан в PL/SQL или использован как часть другого SQL запроса - возвращай его как SQL коллекцию. При этом создав столько коллекций сколько необходимо. Можно ограничиться какой-то универсальной со множеством полей. Все равно код так или иначе обрабатывает определенные поля рекодсета, не так ли? Так вот как раз, именно этого и хотелось бы избежать. То так писать, то эдак. Таблицы к 3 НФ не приведены, в результате чего приходится использовать множество вложенных запросов/процедур, которые в свою очередь плодят никому ненужные данные, а так же засоряют базу (в последствии) неиспользуемыми процедурами/функциями/таблицами. И затем сидишь в этом бардаке и думаешь, зачем это все написали. Именно поэтому я и хочу изучить этот способ. У нас на предприятии у всех руки кривые никто не знает даже что такое ODCI, хотя вроде все настолько кривожопые умные что мне еще учиться у них. И все вместо временных таблиц создают физические таблицы в БД. В общем база такая что черт ногу сломает. Я видел способ написания подобной процедуры через dbms_sql, но база настроена таким образом, что обратившись один раз к полям курсора, больше не пускает и пишет что прав нету. В инете смотрел эту проблему - там много говорили о том что с этими правами лишний раз лучше не играть. Хотя и код процедуры был предоставлен. Я честно скажу что я наложил кирпичей просто побоялся использовать данный метод и решил продолжить поиски. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:51:24 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBТаблицы к 3 НФ не приведены, в результате чего приходится использовать множество вложенных запросов/процедур, которые в свою очередь плодят никому ненужные данные, а так же засоряют базу (в последствии) неиспользуемыми процедурами/функциями/таблицамиЛучше бороться с выделенным. Наивно думать что есть silver bullet которая превратит г в конфетку. Кстати, непонятно как неприведение к 3НФ влият на расплод дерьма в базе. Если у вас хранилище а не OLTP там 3НФ и не нужна. Если что-то комбинированое, то и решение будет комбинированным. В твоем случае уход от нормализации наоборот может помочь для сохранения результатов работы разных процедур/функций в широкой денормализированной таблице и последующей работы с этой таблицей. А может это будет говнодизайн. Все решают детали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:00:59 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGB, Несмотря на отсутвтвие универсальных решений, есть два универсальных совета. 1) Не стоит применять одинаковые паттерны проектирования в MSSQL и Oracle. 2) Без английского мало мальски толковым разработчиком не станешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:03:59 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBНа входе я имею неизвестный набор данных any_table. Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select. Не понимаю, почему такой способ не используется - ведь он был бы очень удобен. Потому что способ обработки данных подразумевает, что структуру набора Вы всё-таки знаете. Или обработка такая же универсальная? Напишите подробней, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:08:48 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
suPPLerSerjantGBНа входе я имею неизвестный набор данных any_table. Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select. Не понимаю, почему такой способ не используется - ведь он был бы очень удобен. Потому что способ обработки данных подразумевает, что структуру набора Вы всё-таки знаете. Или обработка такая же универсальная? Напишите подробней, пожалуйста. Структура в каждом отдельном случае всегда известна. Но содержать и помнить в голове каждый отчет, по 2 - 3 тыс. строк кода с неограниченной вложенностью процедур невозможно. При этом каждая такая процедура (как вложенная, так и базовая) может использовать по 1 - 2 физических таблиц для временного хранения данных. И когда настает момент, (изменения в бух. учете например) когда надо поменять всего пару столбцов, и найти нужные строки посреди необъятного, но еще и мало знакомого кода (то что как правило написано - писал не я) - уходит от 1го дня. Поэтому я и ищу решение для избавления от создания предопределенных временных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 07:43:26 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGB, если всё так, как Вы описываете, то пришла пора платить технический долг по проекту: рефакторинг, создание базы отчётов, документирование, комментирование и т.д. Решение из сабжа только добавляет к необъятному и малознакомому коду ещё немного. Если спросите у коллег, вполне может оказаться, что часть этого уже есть. И даже, что кто-то где-то использует "универсальную процедуру". Или использовал, но забыл, потому что надо было запомнить 2-3 тысячи строк кода, которые формируют отчёт. :) SerjantGBСтруктура в каждом отдельном случае всегда известна. ... Поэтому я и ищу решение для избавления от создания предопределенных временных таблиц Я спрашивал про обработку. Если она в каждом случае "надо поменять пару столбцов" различна, то универсальная процедура по обработке не существует. Придётся писать N конвейеров, каждый со своей логикой обработки. Тогда и использовать сильный REF CURSOR со специализированными коллекциями не проблема. Но без анализа малознакомого кода (и проекта) это всё костыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 11:36:19 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
suPPLer, suPPLerЯ спрашивал про обработку. Если она в каждом случае "надо поменять пару столбцов" различна, то универсальная процедура по обработке не существует. Придётся писать N конвейеров, каждый со своей логикой обработки. Обработка скриптов - это одно дело, другое дело, когда приходится править таблицу которую может использовать данная процедура. Приведу пример: 1) Есть процедура использующая таблицу "студенты_tmp(id, Name, kurs)" в результате работы этой процедуры в данную таблицу складываются такие данные, которые можно потом выбрать простым селектом в отчет crystal reports. 2) Так же есть процедура которая так же использует эту таблицу с такими же столбцами и тоже, но уже по-своему (например с группировкой по Курсу) собирает данные в эту же таблицу. Таблица очищается в начале выполнения процедур. Теперь нам надо изменить второй отчет так, чтобы появился новый столбец, но вот беда, нам мешают старые(например столбцы которые являются NOT_NULL или UNIQUE). Если удалим их - перестанет работать первый отчет. В результате для второго отчета создаем еще одну таблицу с нужными столбцами. Таких примеров полно и все бы ничего если бы хотя бы знать в каких отчетах и как фигурируют такие таблицы, но увы, за 15 лет проб и ошибок (не моих) их наплодилось неимоверное количество. Если писать через "with" - пропадает возможность обновления/дополнения тех данных, которые попали в один из селектов, можно конечно записывать все в курсоры - тогда пропадает возможность объединения данных из нескольких селектов, либо это сильно затруднено. Через pipelined-функцию делал и получилось в результате Код: plsql 1. но для этого приходится каждый раз предопределять тип данных передаваемых в функцию func. Практически равносильно предопределению временной таблицы как это изначально задумано в Oracle. Все это не подходит для более простой и универсальной обработке данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 07:55:12 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBзнать в каких отчетахЕсли плодить таблицы, не ведя "бухгалтерию", то и плоди дальше, зачем знать где оно используется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 08:03:38 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBПриведу пример: 1) Есть процедура использующая таблицу "студенты_tmp(id, Name, kurs)" в результате работы этой процедуры в данную таблицу складываются такие данные, которые можно потом выбрать простым селектом в отчет crystal reports. 2) Так же есть процедура которая так же использует эту таблицу с такими же столбцами и тоже, но уже по-своему (например с группировкой по Курсу) собирает данные в эту же таблицу. Таблица очищается в начале выполнения процедур. Теперь нам надо изменить второй отчет так, чтобы появился новый столбец, но вот беда, нам мешают старые(например столбцы которые являются NOT_NULL или UNIQUE). Если удалим их - перестанет работать первый отчет. В результате для второго отчета создаем еще одну таблицу с нужными столбцами. Таких примеров полно и все бы ничего если бы хотя бы знать в каких отчетах и как фигурируют такие таблицы, но увы, за 15 лет проб и ошибок (не моих) их наплодилось неимоверное количество. Пример ничего не поменял в ситуации. Либо чистить авгиевы конюшни с высочайшего царского соизволения, либо смириться и вносить свою толику навоза, либо уходить. SerjantGBЕсли писать через "with" - пропадает возможность обновления/дополнения тех данных, которые попали в один из селектов, можно конечно записывать все в курсоры - тогда пропадает возможность объединения данных из нескольких селектов, либо это сильно затруднено. Я, честно говоря, не понял, почему невозможно в запросе изменить данные, которые он вернёт. Хоть с WITH, хоть с inline view. И не понял, использовали ли Вы банальные коллекции, представления и нормальные временные таблицы, вообще как-то оптимизировали процедуры формирования отчётов, пытались выделить общие компоненты в модули, убрать лишние зависимости и т.д. Зато вижу, что у Вас есть нормальный зуд разработчика применить "крутую фишку", потому что она кажется Вам похожей на то, что Вы использовали в другой СУБД, вместо того чтобы вникать в проект. :) Но это будет ещё один универсальный способ/таблица/процедура/подход среди сотен тех, из которых складывается бардак у Вас на проекте. Следующий новичок будет спрашивать здесь про то же самое и "зачем здесь ещё и слой с ODCITable в двух с половиной отчётах". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 12:41:08 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
suPPLer, Вы правы :) Хочется и новую фишку, но про слой с ODCITable я с вами не согласен. Ведь в конечном итоге должен получиться тип, при помощи которого будет реализовываться вся работа. То есть то что я изначально написал - то и должно получиться, только с небольшими изменениями: Код: plsql 1. 2. 3. Разве не замечательно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 07:10:24 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
В общем покумекав немного, я потихоньку вроде начал въезжать что же это такое, и решил что надо как-то к практике уже продвигаться, вроде понял что надо написать что-то вроде этого, но пока опять затык. Нужен совет, как правильно? Вот что примерно я хочу: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 07:19:01 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
Вот спецификация: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 07:20:27 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBРазве не замечательно? Код: plsql 1. Для клиента рефкурсор такой же курсор как и любой другой, оборачивание в селект излишне. plsql со статическим связыванием с неопределенным селектом напрямую работать не умеет на этапе компиляции, а с рефкурсором хоть как-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 07:29:35 |
|
||
|
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
|
|||
|---|---|---|---|
|
#18+
SerjantGBНужен совет, как правильноТебе уже два человека озвучили в каком направлении двигаться. Но поскольку ты не согласен, то тебе остаётся надеяться что в топик заглянет кто-то еще знающий ODCITable и либо разделяющий твои взгляды по поводу костылей либо просто желающий помочь тебе выстрелить самому себе в ногу. PS. Видимо ты совсем плохо понимаешь что такое реф курсор и что значит "работает технология с точностью до хард парса". У тебя ничего не получится с таким уровнем понимания, но может что новое узнаешь. Пилите, Шура, пилите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 07:35:09 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39267748&tid=1887954]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
298ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 614ms |

| 0 / 0 |
