Страница 1 из 2
Опять о процедурах
Добавлено: 31 авг 2005, 08:39
tie
есть две таблицы
первая:
FIO D
------------------------------ ---------------
Иванов 4
Петров 5
Сидоров 6
вторая:
D P
----- -----------------
4 молоко
4 каша
4 хлеб
5 молоко
5 хлеб
6 вода
Вопрос... Какой должен быть запрос или что нужно сделать, чтобы получить резудьтат:
FIO T
------------------------------ --------------------------------
Иванов молоко, каша, хлеб
Петров молоко, хлеб
Сидоров вода

Re: Опять о процедурах
Добавлено: 31 авг 2005, 09:01
sag
делаешь хранимую процедуру, в которой в цикле for-select формируешь нужное тебе поле T (собираешь его в переменной) и возвращаешь его клиенту. Можно реализовать двумя циклами (по каждой таблице), можно одним (по одному join-запросу).
p.s.Олег когда-то грозился что-то похожее на агрегатную функцию LIST сделать.
Re: Опять о процедурах
Добавлено: 31 авг 2005, 10:43
tie
sag писал(а):делаешь хранимую процедуру, в которой в цикле for-select формируешь нужное тебе поле T (собираешь его в переменной) и возвращаешь его клиенту. Можно реализовать двумя циклами (по каждой таблице), можно одним (по одному join-запросу).
LIST сделать.
не понял....
если бы это был ORACLE я бы так и сделал
написал бы функцию, которая получив нужный параметр в цикле for-select формирует нужное поле T и передаёт его
и select выгладел бы так:
select fio, My_F(D) from Main_table
а как это сделать в Ibase c учетом что поле D в первой таблице условное например колво дней от определенного события и вычисляется как УКАЗАННАЯ КЛИЕНТОМ ДАТА - УСЛОВНАЯ ДАТА хранящаяся в базе?
Re: Опять о процедурах
Добавлено: 31 авг 2005, 11:18
sag
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 в первой таблице условное например колво дней от определенного события и вычисляется как УКАЗАННАЯ КЛИЕНТОМ ДАТА - УСЛОВНАЯ ДАТА хранящаяся в базе?
тут уже моя очередь говорить "не понял...."
Добавлено: 31 авг 2005, 12:11
tie
Спасибочки
действительно работает, а я и не догадывался.
а еще вопросик можно?
в 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
а что-то подобное есть в ИБ?
Добавлено: 31 авг 2005, 12:24
sag
tie писал(а):а что-то подобное есть в ИБ?
в фб2. На предыдущих версиях эту логику реализуй или на хп или на вью или пересматривай эту самую логику и старайся избежать таких подобностей.
Добавлено: 31 авг 2005, 12:32
tie
sag писал(а):tie писал(а):а что-то подобное есть в ИБ?
в фб2. На предыдущих версиях эту логику реализуй или на хп или на вью или пересматривай эту самую логику и старайся избежать таких подобностей.
да не получается
на вьюхах получается слишком много вьюх причем последняя(результирующая) переодически слетает
и то реализован пока только текущий день (как во вьюху передать разные даты?).
хочется сделать SQL
дело в том, что задача требует прогноз на несколько дней
данные идут по вновь утвержденному плану.
а погноз нудно делать на разные периоды
Добавлено: 31 авг 2005, 12:46
tie
и еще
я могу во where вставить ХП
если да, то какой синтаксис
where x=test(y)???????????????????????
вопрос к kdv
Дима!
Где почитать про синтаксис ХП с учетом вышеизложенного?
Добавлено: 31 авг 2005, 13:49
kdv
Где почитать про синтаксис ХП с учетом вышеизложенного?
в доке и в employee.gdb/fdb
процедуры - это не функции. where x=test(y) - нельзя.
Добавлено: 31 авг 2005, 14:48
tie
kdv писал(а):
в доке и в employee.gdb/fdb
процедуры - это не функции. where x=test(y) - нельзя.
Дима!
Прости тупого

...
дай адресочек на "в доке и в employee.gdb/fdb"
where x=test(y) было написано в качестве примера в надежде что есть какое-то др написание....
а в чем проблема создания функций как у ORACLE
посчитали, что нет надобности или есть проблемы с обработчиком?
может что-то появилось в последних версиях?
надеюсь, что движимся вперед.....
Добавлено: 31 авг 2005, 15:07
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
Добавлено: 31 авг 2005, 17:45
kdv
дай адресочек на "в доке и в employee.gdb/fdb"
ну, база emplyee у тебя на диске. ты же IB/FB себе поставил?
а дока - на сайте. набираешь
www.ibase.ru, дальше наводишь мышку на пункты меню interbase или firebird, там высвечивается "документация". Подводишь мышку туда, клик .... о чудо! Документация! Вот она!!!
а в чем проблема создания функций как у ORACLE
а почему бы Ораклу не сделать select from myproc и джойны с процедурами? СлабО?
Добавлено: 31 авг 2005, 18:20
tie
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
не понял...
И что с этим делать???????
в смысле где применять?
Добавлено: 31 авг 2005, 18:46
tie
kdv писал(а):
а дока - на сайте. набираешь
www.ibase.ru, дальше наводишь мышку на пункты меню
Ты ведь обычно посылаешь к конкретному источнику, а тут так скромно...
пойми меня правильно...
мне всю доку перелопатить, чтобы найти конкретную вещь?
а почему бы Ораклу не сделать select from myproc и джойны с процедурами? СлабО?
а нафига это может понадобиться?
давай не будем п... меряться
ну не нравится мне ИБ...
когда мы выбирали сервер БД (лет 8 назад) - Тестировали. ORACLE на порядок вставлял IB на одинаковых платформах, а окончательный выбор был сделан когда на серваке IB начали пропадать записи (питание выключалось упсы вздувались) заменили IB на ORACLE все стало нормально. 8 лет уже работает. обслуга только периодически базу чистит (убирает годичной давности архивы).
с тех пор много воды утекло....
а сейчас судьба заставила...
ну тяжело маленькому заказчику обьяснить что он должен 5 000 $ выложить за ORACLE (иначе вжарят по кол-ву пользователей).
Вот и вернулись к IB а точнее FB.
сделать хочется нормально, а незнание мелочей дает знать....
один динамический SQL кучу нервов потрепал. а для работы со временем пришлось осваивать UDF. И тд. и тп.
Блин.
Добавлено: 31 авг 2005, 19:10
kdv
Ты ведь обычно посылаешь к конкретному источнику, а тут так скромно...
пойми меня правильно...
мне всю доку перелопатить, чтобы найти конкретную вещь?
ну наглец, ну наглец!!!

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

?
Я ж тебе сказал
Тупой...
я ж тебе не даю 1500 страниц печатного текста, и говорю - ищи. Я тебе даю ссылку на доки....Или у тебя с книжками не срослось?
с книжками не срослось!
Я их читаю только когда полная ж....
За datadef.pdf спасибо. Почитаю.
Только если бы ты не сказал, я ее бы фиг нашел.
намека ты не понял. объясняю. В Оракле то, в IB/FB - это. 100%-ного стандарта нет.
Вот с.....
Интересно а если бы с лампочками было тоже самое, как бы бедные люди жили?
в серверах с развитым SQL можно написать такую херню, что ...
Эт уже от человека зависит и от его преподов, в крайнем случае
Нельзя на SQL писать как на дельфях или на c/c++.
Эт точно
тут у меня один сионист все переменные начал с "_" он так видете ли в С привык
Ладно, Я уже хряпнул коньячку и мне весело, чего и тебе желаю.
Договорим завтра.
кстати
а если потрепаться, как это сделать?
Добавлено: 01 сен 2005, 12:42
tie
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
Добавлено: 01 сен 2005, 12:48
Merlin
Знать бы исчо кто такие D,P,R, в смысле относятся ли оне каким-то боком к Main_table или пописать вышли... Если второе, то уже я не понял, а если первое, хотя бы для одного из них, то я тебе уже раз говорил про джойн с селективной процедурой (второй случай, таблица ведущая), да ты не понял...
Добавлено: 01 сен 2005, 14:09
tie
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
только чувствую что здесь ошибка.....
Добавлено: 01 сен 2005, 14:35
sag
tie писал(а):Вчера не понял (другое спрашивал), а сегодня понял, что в этом что-то есть.
перестраивай думалку. В селект-запросах иб-линейки хп выступает как набор данных, который может состоять из множества "строк". Отсюда и джойны.
А вот написание "left join"-ов апосля ораклиных (+) - эта перестройка для меня была самой трудной
