Хранимая процедура в представлении

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

Ответить
nicolas
Сообщения: 33
Зарегистрирован: 11 сен 2006, 21:37

Хранимая процедура в представлении

Сообщение nicolas » 04 сен 2007, 13:43

Здравствуйте!

Возможно это 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

Это так и должно быть?
Сам запрос отрабатывает нормально, но завернуть в представление не получается.

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

Сообщение kdv » 04 сен 2007, 16:53

в FB2 может это уже и поддерживается (не помню), но в остальных ib/fb - нет.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: Хранимая процедура в представлении

Сообщение Slavik » 04 сен 2007, 20:40

Не понял, а что делает begin...end в конструкции create view? Или я что-то пропустил в нововведениях SQL?

nicolas
Сообщения: 33
Зарегистрирован: 11 сен 2006, 21:37

Re: Хранимая процедура в представлении

Сообщение nicolas » 05 сен 2007, 15:22

Slavik писал(а):Не понял, а что делает begin...end в конструкции create view? Или я что-то пропустил в нововведениях SQL?
:shock:
Извиняюсь за очепятку, просто рядом сделал все через ХП вместо VIEW, а код для примера на автомате слепил как гибрид ХП и VIEW.
Не должно там быть begin ... end конечно.

Спасибо за внимание к вопросу.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: Хранимая процедура в представлении

Сообщение Slavik » 05 сен 2007, 21:57

По существу вопроса.

Во-первых, делать left join и ставить справа процедуру - это чаще всего плохо, т.к. она будет вызываться на каждую строку таблицы слева и выполняться полностью.

Во-вторых, при select с соединением таблицы и процедуры её параметры не могут быть зависимыми, т.е. никаких ссылок на поля других таблиц в параметрах процедуры. Условие соединения таблиц/представлений/процедур согласно синтаксису записываются после слова on. Следовательно, параметры процедуры - в пролёте.

В-третьих. Я вообще не вижу смысла запихивать процедуру в представление. Ведь можно просто сделать ещё одну процедуру!

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

Re: Хранимая процедура в представлении

Сообщение Merlin » 05 сен 2007, 22:05

Slavik писал(а):По существу вопроса.
По существу ответа.
Slavik писал(а): Во-первых, делать left join и ставить справа процедуру - это чаще всего плохо, т.к. она будет вызываться на каждую строку таблицы слева и выполняться полностью.
Однако, если это нужно, то именно так и делают. Другого способа сделать процедуру ведомой в джойне нет.
Slavik писал(а): Во-вторых, при select с соединением таблицы и процедуры её параметры не могут быть зависимыми, т.е. никаких ссылок на поля других таблиц в параметрах процедуры. Условие соединения таблиц/представлений/процедур согласно синтаксису записываются после слова on. Следовательно, параметры процедуры - в пролёте.
А мужики-то не знают (С). И все именно так и делают. С левым джойном-то и ведущей(ми) таблицей(ми), и ведомой(ми) процедурой(ми) и фиктивным ON на присоединении процедур. И ни у кого поля таблиц в параметрах процедур не в пролёте :wink:
Slavik писал(а): В-третьих. Я вообще не вижу смысла запихивать процедуру в представление. Ведь можно просто сделать ещё одну процедуру!
И это правда.

nicolas
Сообщения: 33
Зарегистрирован: 11 сен 2006, 21:37

Re: Хранимая процедура в представлении

Сообщение nicolas » 05 сен 2007, 22:09

Slavik писал(а):По существу вопроса.

Во-первых, делать left join и ставить справа процедуру - это чаще всего плохо, т.к. она будет вызываться на каждую строку таблицы слева и выполняться полностью.

Во-вторых, при select с соединением таблицы и процедуры её параметры не могут быть зависимыми, т.е. никаких ссылок на поля других таблиц в параметрах процедуры. Условие соединения таблиц/представлений/процедур согласно синтаксису записываются после слова on. Следовательно, параметры процедуры - в пролёте.

В-третьих. Я вообще не вижу смысла запихивать процедуру в представление. Ведь можно просто сделать ещё одну процедуру!
На п.1: Да, так оно и задумано по смыслу, для каждой строки из таблицы надо еще рассчитать некие значения, которые могут быть получены только путем выполнения ХП, а не через запросы

На п.2: Наверное движок у меня об этом ничего не знает, т.к. все замечательно работает. Кстати, такое решение подсказали гуру с этого форума :roll:

На п.3: Представление имеет для нас некие преимущества по скорости выборки при наличии ограничений (по крайней мере для других случаев имеет, здесь - еще не тестировали), а раз нельзя через представление - таки сделали через ХП

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: Хранимая процедура в представлении

Сообщение Slavik » 06 сен 2007, 12:08

Merlin писал(а):А мужики-то не знают (С). И все именно так и делают. С левым джойном-то и ведущей(ми) таблицей(ми), и ведомой(ми) процедурой(ми) и фиктивным ON на присоединении процедур. И ни у кого поля таблиц в параметрах процедур не в пролёте :wink:
:oops: Облажался я... Действительно всё классно работает, а я - дурак - до сих пор мучался, не пользуясь этим финтом... :)
nicolas писал(а):На п.2: Наверное движок у меня об этом ничего не знает, т.к. все замечательно работает. Кстати, такое решение подсказали гуру с этого форума :roll:
Не понял, так в чём проблема, если все замечательно работает? Другими инструментами пробовал создавать представление?

nicolas
Сообщения: 33
Зарегистрирован: 11 сен 2006, 21:37

Re: Хранимая процедура в представлении

Сообщение nicolas » 06 сен 2007, 13:34

Slavik писал(а):
nicolas писал(а):На п.2: Наверное движок у меня об этом ничего не знает, т.к. все замечательно работает. Кстати, такое решение подсказали гуру с этого форума :roll:
Не понял, так в чём проблема, если все замечательно работает? Другими инструментами пробовал создавать представление?
Другими не пробовал, IBExpert не дает. Ну как объяснили здешние гуру, и не должно.
Просто запрос работает, в представление не заворачивается. Будем надеятся в двойке сделают.
А пока действительно сделал ХП вместо представления...

Ответить