![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Коллеги. Существует ли PL/SQL возможность написать функцию, которая бы возвращала таблицу. Т.е. что бы можно было использовать конструкцию типа «Select * from getmytable(23)». Если можно, то как это сделать?
|
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
rtfm pipelined function
только, думается мне, не нужно Вам оно это. 88,88% новичков в оракле ищут подобные возможности лишь для того, чтобы применить паттерны программирования заимствованные из других платформ, что бывает весьма пагубно -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Тут ситуация другая. Есть таблица - состав изделия (спецификация) - реализующая в себе древовидную структуру. Есть таблица замен. Задача – получить на базе основной спецификации и таблицы замен новый, актуальный состав изделия. Все усложняется тем, что новые спецификации могут строиться не только на основании «базовой спецификации» (первой самой полной), но и на базе уже «модифицированной» – т.е. тут явно напрашивается рекурсия для получения всех промежуточных составов с выходом на актуальный. Как реализовать эту задачу по-другому я пока не знаю – сейчас я в поиске. Может, есть соображения на эту тему? – буду рад услышать.
|
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
может попытаетесь показать на пальцах? Привести исходные данные, показать ожидаемый результат, дать краткие посяснения по какому принципу получен результат. Сейчас вы слишком обще изложили суть проблемы, чтобы дать вам сколь нибудь конкретный совет. для работы с иерархическими структурами можно испльзовать connect by для иттерационных вычислений можно использовать model -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Выглядит это примерно так:
ID FATHER SIGN BASEID 10 0 стол1 0 11 10 ножка 12 11 деревяшка 13 11 опора 14 11 винт 15 10 столешница Изделие «стол1» состоит из «столешницы» и «ножки». «Ножка» состоит из «деревяшки», «опоры» и «винта». Значение BASEID=0 для ID=10 говорит о том, что это «базовая» спецификация. Далее, та же таблица: 20 0 стол2 10 21 0 стол3 20 BASEID<>0 говорит о том что для «стола2» базовая спецификация является «стол1» (BASEID=10), а для «стола3» - «стол2» (BASEID=20). Смотрим таблицу модификаций: ID FORID O_ID O_FATHER N_ID N_FATHER SIGN 100 20 13 11 0 0 101 21 15 10 23 10 доска При формировании спецификации «стола2» мы должны использовать спецификацию «стола1» (BASEID=10) исключив из него деталь «опора» (O_ID,O_FATHER,N_ID,N_FATHER=13,11,0,0). Т.е. получается тот же стол, из тех же деталей, но без опоры. «Стол3» это «стол2» (BASEID=20, который без опоры) + в нем заменена «столешница» на «доску» (O_ID,O_FATHER,N_ID,N_FATHER= 15,10, 23,10, «доска»). Как то так... Затеяно все это для экономии пространства в БД т.к. все спецификации состоят из более 1000 элементов, а вносимые изменения слишком незначительны, что бы хранить на каждое измененное состояние целый состав. Зачем нужна функция? Затем, что в дальнейшем планируется подсчет количества однотипных деталей для нескольких изделий, и было бы «проще» и «красивей» получать составы одной функцией, передав ей нужные идентификаторы изделий. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Да, помоему вы себе усложнили жизнь на столько, на сколько могли и пайплайна вам тут очень поможет
![]() -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Вот, вот… И я о том же…
![]() Добавлено через 4 минуты и 56 секунд Я так понимаю пайплайна будет считаться один раз и помещаться в буфер? Т.е. при запросе «Select * from tab t, getmytable(23) a where a.id=t.id» не будет рассчитываться каждый раз заново? |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
нет, она будет считаться всякий раз. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Ясно. Спасибо. Буду пробовать...
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Oracle" | |
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Oracle | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |