Страница 1 из 1
Хранимая процедура в представлении
Добавлено: 04 сен 2007, 13:43
nicolas
Здравствуйте!
Возможно это FAQ, но... записываю представление, а в нем ХП в виде:
Код: Выделить всё
create view MY_VIEW(A, B) as
begin
select T0.COL1, T1.VAL from MY_TABLE T0
left join MY_SP(T0.C) T1 on (1=1)
end
IBExpert отказывается компилировать, ссылаясь на неизвестый символ ( -первая скобка после MY_SP
Это так и должно быть?
Сам запрос отрабатывает нормально, но завернуть в представление не получается.
Добавлено: 04 сен 2007, 16:53
kdv
в FB2 может это уже и поддерживается (не помню), но в остальных ib/fb - нет.
Re: Хранимая процедура в представлении
Добавлено: 04 сен 2007, 20:40
Slavik
Не понял, а что делает begin...end в конструкции create view? Или я что-то пропустил в нововведениях SQL?
Re: Хранимая процедура в представлении
Добавлено: 05 сен 2007, 15:22
nicolas
Slavik писал(а):Не понял, а что делает begin...end в конструкции create view? Или я что-то пропустил в нововведениях SQL?
Извиняюсь за очепятку, просто рядом сделал все через ХП вместо VIEW, а код для примера на автомате слепил как гибрид ХП и VIEW.
Не должно там быть begin ... end конечно.
Спасибо за внимание к вопросу.
Re: Хранимая процедура в представлении
Добавлено: 05 сен 2007, 21:57
Slavik
По существу вопроса.
Во-первых, делать left join и ставить справа процедуру - это чаще всего плохо, т.к. она будет вызываться на каждую строку таблицы слева и выполняться полностью.
Во-вторых, при select с соединением таблицы и процедуры её параметры не могут быть зависимыми, т.е. никаких ссылок на поля других таблиц в параметрах процедуры. Условие соединения таблиц/представлений/процедур согласно синтаксису записываются после слова on. Следовательно, параметры процедуры - в пролёте.
В-третьих. Я вообще не вижу смысла запихивать процедуру в представление. Ведь можно просто сделать ещё одну процедуру!
Re: Хранимая процедура в представлении
Добавлено: 05 сен 2007, 22:05
Merlin
Slavik писал(а):По существу вопроса.
По существу ответа.
Slavik писал(а):
Во-первых, делать left join и ставить справа процедуру - это чаще всего плохо, т.к. она будет вызываться на каждую строку таблицы слева и выполняться полностью.
Однако, если это нужно, то именно так и делают. Другого способа сделать процедуру ведомой в джойне нет.
Slavik писал(а):
Во-вторых, при select с соединением таблицы и процедуры её параметры не могут быть зависимыми, т.е. никаких ссылок на поля других таблиц в параметрах процедуры. Условие соединения таблиц/представлений/процедур согласно синтаксису записываются после слова on. Следовательно, параметры процедуры - в пролёте.
А мужики-то не знают (С). И все именно так и делают. С левым джойном-то и ведущей(ми) таблицей(ми), и ведомой(ми) процедурой(ми) и фиктивным ON на присоединении процедур. И ни у кого поля таблиц в параметрах процедур не в пролёте
Slavik писал(а):
В-третьих. Я вообще не вижу смысла запихивать процедуру в представление. Ведь можно просто сделать ещё одну процедуру!
И это правда.
Re: Хранимая процедура в представлении
Добавлено: 05 сен 2007, 22:09
nicolas
Slavik писал(а):По существу вопроса.
Во-первых, делать left join и ставить справа процедуру - это чаще всего плохо, т.к. она будет вызываться на каждую строку таблицы слева и выполняться полностью.
Во-вторых, при select с соединением таблицы и процедуры её параметры не могут быть зависимыми, т.е. никаких ссылок на поля других таблиц в параметрах процедуры. Условие соединения таблиц/представлений/процедур согласно синтаксису записываются после слова on. Следовательно, параметры процедуры - в пролёте.
В-третьих. Я вообще не вижу смысла запихивать процедуру в представление. Ведь можно просто сделать ещё одну процедуру!
На п.1: Да, так оно и задумано по смыслу, для каждой строки из таблицы надо еще рассчитать некие значения, которые могут быть получены только путем выполнения ХП, а не через запросы
На п.2: Наверное движок у меня об этом ничего не знает, т.к. все замечательно работает. Кстати, такое решение подсказали гуру с этого форума
На п.3: Представление имеет для нас некие преимущества по скорости выборки при наличии ограничений (по крайней мере для других случаев имеет, здесь - еще не тестировали), а раз нельзя через представление - таки сделали через ХП
Re: Хранимая процедура в представлении
Добавлено: 06 сен 2007, 12:08
Slavik
Merlin писал(а):А мужики-то не знают (С). И все именно так и делают. С левым джойном-то и ведущей(ми) таблицей(ми), и ведомой(ми) процедурой(ми) и фиктивным ON на присоединении процедур. И ни у кого поля таблиц в параметрах процедур не в пролёте


Облажался я... Действительно всё классно работает, а я - дурак - до сих пор мучался, не пользуясь этим финтом...
nicolas писал(а):На п.2: Наверное движок у меня об этом ничего не знает, т.к. все замечательно работает. Кстати, такое решение подсказали гуру с этого форума

Не понял, так в чём проблема, если все замечательно работает? Другими инструментами пробовал создавать представление?
Re: Хранимая процедура в представлении
Добавлено: 06 сен 2007, 13:34
nicolas
Slavik писал(а):
nicolas писал(а):На п.2: Наверное движок у меня об этом ничего не знает, т.к. все замечательно работает. Кстати, такое решение подсказали гуру с этого форума

Не понял, так в чём проблема, если все замечательно работает? Другими инструментами пробовал создавать представление?
Другими не пробовал, IBExpert не дает. Ну как объяснили здешние гуру, и не должно.
Просто запрос работает, в представление не заворачивается. Будем надеятся в двойке сделают.
А пока действительно сделал ХП вместо представления...