Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PL/SQL функция - как вернуть таблицу? PL/SQL функция - как вернуть таблицу? 
:(
    Опции темы
Matrex
Дата 17.1.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 31.1.2006

Репутация: нет
Всего: 2



Коллеги. Существует ли PL/SQL возможность написать функцию, которая бы возвращала таблицу. Т.е. что бы можно было использовать конструкцию типа «Select * from getmytable(23)». Если можно, то как это сделать?
PM MAIL   Вверх
Zloxa
Дата 17.1.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



rtfm pipelined function

только, думается мне, не нужно Вам оно это. 88,88% новичков в оракле ищут подобные возможности лишь для того, чтобы применить паттерны программирования заимствованные из других платформ, что бывает весьма пагубно


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Matrex
Дата 17.1.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 31.1.2006

Репутация: нет
Всего: 2



Тут ситуация другая. Есть таблица - состав изделия (спецификация) - реализующая в себе древовидную структуру. Есть таблица замен. Задача – получить на базе основной спецификации и таблицы замен новый, актуальный состав изделия. Все усложняется тем, что новые спецификации могут строиться не только на основании «базовой спецификации» (первой самой полной), но и на базе уже «модифицированной» – т.е. тут явно напрашивается рекурсия для получения всех промежуточных составов с выходом на актуальный. Как реализовать эту задачу по-другому я пока не знаю – сейчас я в поиске. Может, есть соображения на эту тему? – буду рад услышать.
PM MAIL   Вверх
Zloxa
Дата 17.1.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Matrex @  17.1.2011,  10:28 Найти цитируемый пост)
Может, есть соображения на эту тему?

может попытаетесь показать на пальцах? Привести исходные данные, показать ожидаемый результат, дать краткие посяснения по какому принципу получен результат.
Сейчас вы слишком обще изложили суть проблемы, чтобы дать вам сколь нибудь конкретный совет.

для работы с иерархическими структурами можно испльзовать connect by 
для иттерационных вычислений можно использовать model



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Matrex
Дата 17.1.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 элементов, а вносимые изменения слишком незначительны, что бы хранить на каждое измененное состояние целый состав. Зачем нужна функция? Затем, что в дальнейшем планируется подсчет количества однотипных деталей для нескольких  изделий, и было бы «проще» и «красивей» получать составы одной функцией, передав ей нужные идентификаторы изделий.

PM MAIL   Вверх
Zloxa
Дата 17.1.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Да, помоему вы себе усложнили жизнь на столько, на сколько могли и пайплайна вам тут очень поможет smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Matrex
Дата 17.1.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 31.1.2006

Репутация: нет
Всего: 2



Вот, вот… И я о том же… smile Рассматривается еще вариант с использованием временных таблиц. Т.е. состав изделий перед любыми расчетами запихивать во временную таблицу и потом его юзать… Правда, пока не знаю что лучше и где «подводные» камни у того и другого варианта…

Добавлено через 4 минуты и 56 секунд
Я так понимаю пайплайна будет считаться один раз и помещаться в буфер? Т.е. при запросе «Select * from tab t, getmytable(23) a where a.id=t.id» не будет рассчитываться каждый раз заново?
PM MAIL   Вверх
Zloxa
Дата 17.1.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Matrex @  17.1.2011,  12:09 Найти цитируемый пост)
Я так понимаю пайплайна будет считаться один раз и помещаться в буфер? 

нет, она будет считаться всякий раз.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Matrex
Дата 17.1.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 31.1.2006

Репутация: нет
Всего: 2



Ясно. Спасибо. Буду пробовать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.