Опять о процедурах

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Опять о процедурах

Сообщение tie » 31 авг 2005, 08:39

есть две таблицы
первая:
FIO D
------------------------------ ---------------
Иванов 4
Петров 5
Сидоров 6

вторая:
D P
----- -----------------
4 молоко
4 каша
4 хлеб
5 молоко
5 хлеб
6 вода

Вопрос... Какой должен быть запрос или что нужно сделать, чтобы получить резудьтат:
FIO T
------------------------------ --------------------------------
Иванов молоко, каша, хлеб
Петров молоко, хлеб
Сидоров вода

:oops: :oops: :oops: :oops: :oops: :oops:

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Re: Опять о процедурах

Сообщение sag » 31 авг 2005, 09:01

делаешь хранимую процедуру, в которой в цикле for-select формируешь нужное тебе поле T (собираешь его в переменной) и возвращаешь его клиенту. Можно реализовать двумя циклами (по каждой таблице), можно одним (по одному join-запросу).

p.s.Олег когда-то грозился что-то похожее на агрегатную функцию LIST сделать.

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Re: Опять о процедурах

Сообщение tie » 31 авг 2005, 10:43

sag писал(а):делаешь хранимую процедуру, в которой в цикле for-select формируешь нужное тебе поле T (собираешь его в переменной) и возвращаешь его клиенту. Можно реализовать двумя циклами (по каждой таблице), можно одним (по одному join-запросу).
LIST сделать.
не понял....
если бы это был ORACLE я бы так и сделал
написал бы функцию, которая получив нужный параметр в цикле for-select формирует нужное поле T и передаёт его
и select выгладел бы так:

select fio, My_F(D) from Main_table

а как это сделать в Ibase c учетом что поле D в первой таблице условное например колво дней от определенного события и вычисляется как УКАЗАННАЯ КЛИЕНТОМ ДАТА - УСЛОВНАЯ ДАТА хранящаяся в базе?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Re: Опять о процедурах

Сообщение sag » 31 авг 2005, 11:18

tie писал(а):не понял....
если бы это был ORACLE я бы так и сделал написал бы функцию, которая получив нужный параметр в цикле for-select формирует нужное поле T и передаёт его и select выгладел бы так:
select fio, My_F(D) from Main_table
оракл, угу, на иб чуть другой sql-слэнг:

Код: Выделить всё

CREATE PROCEDURE CHEM_PITALSYA(PARAM ...)
RETURNS (T VARCHAR(...)) AS
BEGIN
  FOR SELECT ...
  FROM ...
  WHERE :PARAM ....
  INTO ...
  DO  /*формируешь T*/
  SUSPEND;
END

Код: Выделить всё

select fio, 
(select T from CHEM_PITALSYA(D))
from Main_table 
tie писал(а):а как это сделать в Ibase c учетом что поле D в первой таблице условное например колво дней от определенного события и вычисляется как УКАЗАННАЯ КЛИЕНТОМ ДАТА - УСЛОВНАЯ ДАТА хранящаяся в базе?
тут уже моя очередь говорить "не понял...."

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 12:11

Спасибочки :D :D
действительно работает, а я и не догадывался. :shock: :shock:
а еще вопросик можно?

в ORACLE можем написать:

select
m.name,
s.name
from
(select id, name from main where ...) m,
(select id, name from second where ...) s
where m.id=s.id

а что-то подобное есть в ИБ?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 31 авг 2005, 12:24

tie писал(а):а что-то подобное есть в ИБ?
в фб2. На предыдущих версиях эту логику реализуй или на хп или на вью или пересматривай эту самую логику и старайся избежать таких подобностей.

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 12:32

sag писал(а):
tie писал(а):а что-то подобное есть в ИБ?
в фб2. На предыдущих версиях эту логику реализуй или на хп или на вью или пересматривай эту самую логику и старайся избежать таких подобностей.
да не получается
на вьюхах получается слишком много вьюх причем последняя(результирующая) переодически слетает
и то реализован пока только текущий день (как во вьюху передать разные даты?).

хочется сделать SQL

дело в том, что задача требует прогноз на несколько дней
данные идут по вновь утвержденному плану. :wink: :wink:
а погноз нудно делать на разные периоды
Последний раз редактировалось tie 31 авг 2005, 12:48, всего редактировалось 1 раз.

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 12:46

и еще
я могу во where вставить ХП
если да, то какой синтаксис

where x=test(y)???????????????????????

вопрос к kdv
Дима!
Где почитать про синтаксис ХП с учетом вышеизложенного?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 авг 2005, 13:49

Где почитать про синтаксис ХП с учетом вышеизложенного?
в доке и в employee.gdb/fdb

процедуры - это не функции. where x=test(y) - нельзя.

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 14:48

kdv писал(а): в доке и в employee.gdb/fdb

процедуры - это не функции. where x=test(y) - нельзя.
Дима!
Прости тупого :shock: ...
дай адресочек на "в доке и в employee.gdb/fdb"

where x=test(y) было написано в качестве примера в надежде что есть какое-то др написание....

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

может что-то появилось в последних версиях?

надеюсь, что движимся вперед.....

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 31 авг 2005, 15:07

Вперёд мы не движемся никогда ибо вперёд - это всегда к тому, как привык лично кажный конкретный Я :)

Ведущая процедура (P), ведомая таблица (T)

Select тыры-пыры
From P(:InParam) Join T On T.ID=P.OutParam

Ведущая таблица, ведомая процедура

Select трали-вали
From T Left Join P(T.ID) On 0=0

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 авг 2005, 17:45

дай адресочек на "в доке и в employee.gdb/fdb"
ну, база emplyee у тебя на диске. ты же IB/FB себе поставил?
а дока - на сайте. набираешь www.ibase.ru, дальше наводишь мышку на пункты меню interbase или firebird, там высвечивается "документация". Подводишь мышку туда, клик .... о чудо! Документация! Вот она!!!
а в чем проблема создания функций как у ORACLE
а почему бы Ораклу не сделать select from myproc и джойны с процедурами? СлабО?

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 18:20

Merlin писал(а): Ведущая процедура (P), ведомая таблица (T)

Select тыры-пыры
From P(:InParam) Join T On T.ID=P.OutParam

Ведущая таблица, ведомая процедура

Select трали-вали
From T Left Join P(T.ID) On 0=0
не понял...
И что с этим делать???????
в смысле где применять?

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 18:46

kdv писал(а): а дока - на сайте. набираешь www.ibase.ru, дальше наводишь мышку на пункты меню
Ты ведь обычно посылаешь к конкретному источнику, а тут так скромно...
пойми меня правильно...
мне всю доку перелопатить, чтобы найти конкретную вещь?
а почему бы Ораклу не сделать select from myproc и джойны с процедурами? СлабО?
а нафига это может понадобиться?

давай не будем п... меряться
ну не нравится мне ИБ...
когда мы выбирали сервер БД (лет 8 назад) - Тестировали. ORACLE на порядок вставлял IB на одинаковых платформах, а окончательный выбор был сделан когда на серваке IB начали пропадать записи (питание выключалось упсы вздувались) заменили IB на ORACLE все стало нормально. 8 лет уже работает. обслуга только периодически базу чистит (убирает годичной давности архивы).

с тех пор много воды утекло....
а сейчас судьба заставила...
ну тяжело маленькому заказчику обьяснить что он должен 5 000 $ выложить за ORACLE (иначе вжарят по кол-ву пользователей).
Вот и вернулись к IB а точнее FB.
сделать хочется нормально, а незнание мелочей дает знать....
один динамический SQL кучу нервов потрепал. а для работы со временем пришлось осваивать UDF. И тд. и тп.

Блин.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 авг 2005, 19:10

Ты ведь обычно посылаешь к конкретному источнику, а тут так скромно...
пойми меня правильно...
мне всю доку перелопатить, чтобы найти конкретную вещь?
ну наглец, ну наглец!!! :) я ж тебе не даю 1500 страниц печатного текста, и говорю - ищи. Я тебе даю ссылку на доки, в электронном виде. Ты доку-то открывал? Или так тяжело дотумкать открыть datadef.pdf, посмотреть ГЛАВУ про РАБОТУ С ПРОЦЕДУРАМИ? Документацию что, идиоты писали? Или у тебя с книжками не срослось? :)
а нафига это может понадобиться?
намека ты не понял. объясняю. В Оракле то, в IB/FB - это. 100%-ного стандарта нет. Вот в MS SQL - вообще типа Visual Basic. Может, Ораклу это перенять? Или MS-у перенять стиль Оракла?
Между прочим, народ, который переходит с IB/FB на Оракл, очень страдают по селективным процедурам.
в ORACLE можем написать:
в серверах с развитым SQL можно написать такую херню, что ...
Вот выйдет релиз FB 2.0 - увидишь, какие дебильные запросы будет писать народ с использованием select from select. Как это ни странно, ограниченность средств дисциплинирует, и позволяет не писать всякую лажу, абы сервер "схавал". И это при том, что оптимизатор в Оракле тоже не подарок.

Не лично тебе, но именно ты дал намек - вот пишут работу с сервером ТАК, пока разрабатывают. А когда приходит пора промышленной эксплуатации, хватаются за голову, и запросы ПЕРЕПИСЫВАЮТ.
Нельзя на SQL писать как на дельфях или на c/c++.

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 31 авг 2005, 20:48

kdv писал(а): ну наглец, ну наглец!!! :) ?
Я ж тебе сказал
Тупой...
я ж тебе не даю 1500 страниц печатного текста, и говорю - ищи. Я тебе даю ссылку на доки....Или у тебя с книжками не срослось? :)
с книжками не срослось!

Я их читаю только когда полная ж....
За datadef.pdf спасибо. Почитаю.
Только если бы ты не сказал, я ее бы фиг нашел.
намека ты не понял. объясняю. В Оракле то, в IB/FB - это. 100%-ного стандарта нет.
Вот с.....
Интересно а если бы с лампочками было тоже самое, как бы бедные люди жили?
в серверах с развитым SQL можно написать такую херню, что ...
Эт уже от человека зависит и от его преподов, в крайнем случае
Нельзя на SQL писать как на дельфях или на c/c++.
Эт точно
тут у меня один сионист все переменные начал с "_" он так видете ли в С привык

Ладно, Я уже хряпнул коньячку и мне весело, чего и тебе желаю.
Договорим завтра.
кстати
а если потрепаться, как это сделать?

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 01 сен 2005, 12:42

HELP!

можно ли оптимальней написать:

select
fio,
(select Text_ from CHTO_SKOLKO_KUSHAEM(D,P,R)) ,
(select Kol_ from CHTO_SKOLKO_KUSHAEM(D,P,R))
from Main_table

например что-то вроде:

select fio, (select Text_, Kol_ from CHTO_SKOLKO_KUSHAEM(D,P,R))
from Main_table

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 01 сен 2005, 12:48

Знать бы исчо кто такие D,P,R, в смысле относятся ли оне каким-то боком к Main_table или пописать вышли... Если второе, то уже я не понял, а если первое, хотя бы для одного из них, то я тебе уже раз говорил про джойн с селективной процедурой (второй случай, таблица ведущая), да ты не понял...

tie
Сообщения: 39
Зарегистрирован: 14 июл 2005, 12:12

Сообщение tie » 01 сен 2005, 14:09

Merlin писал(а):Знать бы исчо кто такие D,P,R, в смысле относятся ли оне каким-то боком к Main_table
Да естественно D,P,R - информация из Main_table....
я тебе уже раз говорил про джойн с селективной процедурой (второй случай, таблица ведущая), да ты не понял...
Вчера не понял (другое спрашивал), а сегодня понял, что в этом что-то есть. По тексту видно что вопросы разные

первый касался (вроде так будет работать):
Select * from Main_table
where current_date < (select DT_ from COUNT_DT(Main_table.D))

а второй, сегодняшний:
Select
Main_table.D, Main_table.P, Main_table.R,
TEST_PROC.L, TEST_PROC.K
From Main_table
Left Join
TEST_PROC(Main_table.D, Main_table.P, Main_table.R) On 0=0

только чувствую что здесь ошибка.....

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 01 сен 2005, 14:35

tie писал(а):Вчера не понял (другое спрашивал), а сегодня понял, что в этом что-то есть.
перестраивай думалку. В селект-запросах иб-линейки хп выступает как набор данных, который может состоять из множества "строк". Отсюда и джойны.
А вот написание "left join"-ов апосля ораклиных (+) - эта перестройка для меня была самой трудной 8-)

Ответить