Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Добрый день!
С удивлением узнала, что вроде бы из функций, например, нельзя вызвать процедуру.

Но вроде бы только функции могут быть вызваны в обычном select, не T-SQL.

Но как тогда быть, если нужный код, который должен быть использован для вычисления значения функции, описан в процедуре?
22 авг 11, 16:35    [11158441]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kateryne
С удивлением узнала, что вроде бы из функций, например, нельзя вызвать процедуру.
А вы хелп почаще читайте, удивлений меньше будет.
Kateryne
Но вроде бы только функции могут быть вызваны в обычном select, не T-SQL.
С удивлением узнал, что select - это не T-SQL.
Kateryne
Но как тогда быть, если нужный код, который должен быть использован для вычисления значения функции, описан в процедуре?
Скопипастить его в функцию.

Сообщение было отредактировано: 22 авг 11, 16:37
22 авг 11, 16:36    [11158460]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
select - ANSI sql
22 авг 11, 16:38    [11158476]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
>> А вы хелп почаще читайте, удивлений меньше будет.
да я постолько-поскольку с MS SQL на стороне СУБД имею дело, поэтому хелп открывать необходимость редко назревает
но когда открыла - была очень удивлена и расстроена

>> Скопипастить его в функцию
Не, ну это не решение, а обходной путь из не самых лучших. И что, никакого другого способа нет?
22 авг 11, 16:41    [11158507]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
execute
22 авг 11, 16:43    [11158524]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
exec - это опять таки, T-SQL
А если на стороне приложения доступен только ANSI SQL, то есть можно только выполнить select или другой оператор SQL?
22 авг 11, 16:45    [11158547]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Скопипастить его в функцию.
Это не всегда возможно. Например п-ра работает с врем. таблицами.
22 авг 11, 16:51    [11158604]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Kateryne,

можно пойти на хитрость, создать пустую таблицу в ней создать триггер и перенести туда выполнение вашей странной функции с записью результата в таблицу, ну а потом читать результат из той же самой таблицы.
надеюсь ваше приложении умеет больше одного запроса ansi sql делать:)
22 авг 11, 17:05    [11158756]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
А если на стороне приложения доступен только ANSI SQL, то есть можно только выполнить select или другой оператор SQL?

И как вы собирались тогда изначально "нужный код, описан в процедуре" ?
22 авг 11, 17:07    [11158783]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
>> И как вы собирались тогда изначально "нужный код, описан в процедуре" ?
Обычно, как в Oracle, и как я думала - так же как в MS SQL.

типа такого (синтаксис упростила)

procedure MyProc(Par1)

function MyFunc(Par2)
begin
MyProc(Par1); // процедура что-то сделала, нужное для функции. Например, вернула несколько значений или создала что-то
@res = получила_значение_каким-то_образом_связанное с MyProc
return @res
end;

а в селекте уже

select MyFunc(Field) from table
22 авг 11, 17:47    [11159236]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Или вы спрашиваете, почему нужный код оказался в процедуре, раз мы знали, что приложение не использует T-SQL?
Есть такое слово, ребята - интеграция называется Мы и не знали, потому что не писали этой процедуры
22 авг 11, 17:48    [11159251]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Kateryne,

Если процедура сугубо читающая, то выделите ее тело в функцию. Полученную функцию используйте и в процедуре и в селекте.
22 авг 11, 17:55    [11159329]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Нет, процедура не только читает, увы :(
22 авг 11, 17:58    [11159361]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kateryne
Нет, процедура не только читает, увы :(
У разных продуктов разные ограничения и способы применения. Ничего не поделаешь.

То, что из функций нельзя вызвать процедуры, должно быть понятно и без хелпа :-)

Остальные ограничения не настолько понятны и необходимы... Ну, о них нужно просто узнать...
22 авг 11, 18:19    [11159541]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
>> У разных продуктов разные ограничения и способы применения. Ничего не поделаешь.

тут согласна

>> То, что из функций нельзя вызвать процедуры, должно быть понятно и без хелпа :-)

А вот тут не поняла. По ошибке при выполнении - да, более-менее понятно. Но вы так сказали, как будто это логично, а я тут что-то логики не понимаю.
22 авг 11, 18:43    [11159683]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kateryne,

принцип простой - функция не может иметь никаких side effects (побочных эффектов).
Только возврат результата.

По секрету скажу Вам, что из функций можно, однако, вызывать extended stored procedures (ESP)
Правда, Microsoft обещает в скором времени их запретить...
В общем, это Вам вряд ли поможет.
22 авг 11, 18:59    [11159743]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kateryne
По ошибке при выполнении - да, более-менее понятно. Но вы так сказали, как будто это логично, а я тут что-то логики не понимаю.
Что будет делать функция, если в процедуре ей выдадут десяток селектов, причём при каждом вызове разные?

И это тоже:
iap
принцип простой - функция не может иметь никаких side effects (побочных эффектов).
Только возврат результата.
Так как функция участвует в запросе и с учётом её использования строится план выполнения, на неё накладываются определённые ограничения. Иначе пришлось бы делать перекомпиляцию на каждой строчке запроса, т.к. в MSSQL процедуры пишутся достаточно свободно и не связываются с метаданными.
22 авг 11, 20:38    [11160041]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Ну, в Oracle таких особенностей нет, и там тоже все логично. Запросов можно в процедуре выдать сколько угодно, но с точки зрения функции, их не будет, функция будет использовать только результат действия процедуры.
Но почему так в скуле сделали, кажется поняла. Ограничение уже выбранной архитектуры... Ок...
23 авг 11, 08:20    [11161232]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kateryne
Ну, в Oracle таких особенностей нет, и там тоже все логично. Запросов можно в процедуре выдать сколько угодно, но с точки зрения функции, их не будет, функция будет использовать только результат действия процедуры.
Но почему так в скуле сделали, кажется поняла. Ограничение уже выбранной архитектуры... Ок...
В оракле есть много других абсурдных особенностей, тоже ограничение уже выбранной архитектуры.

Для примера, в процедурах нельзя просто навставлять в произвольних местах селектов, да ещё и с изменяющейся от вызова к вызову структурой возвращаемого набора данных. Ещё нельзя, как в DB2, писать хранимки на любом языке, или нельзя писать хранимки в выражениях операторов реляционного движка СУБД.

Но так как вы с ораклом работаете, они вам кажутся вполне нормальными.

На самом деле, как я говорил, это просто разный подход, выбранный в далёкие годы сайбесом и ораклом, его нужно просто знать. Не ограничения реализации, разумеется, а разные принципы.

Это как сравнения C и SQL: нельзя же назвать что то из этого ограниченным и ущербным - они просто раные.
23 авг 11, 10:03    [11161711]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Badger Brock
Guest
CLR-функции могут вам помочь.
23 авг 11, 11:00    [11162153]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
alexeyvg
Это как сравнения C и SQL: нельзя же назвать что то из этого ограниченным и ущербным - они просто разные.

Да я и не наезжаю на скуль, просто очень удивилась, мне казалось оракловое и постгрессовое поведение функций самоочевидным для любой СУБД.

alexeyvg
Для примера, в процедурах нельзя просто навставлять в произвольних местах селектов, да ещё и с изменяющейся от вызова к вызову структурой возвращаемого набора данных.


Да вроде бы можно. Или не поняла вас?

alexeyvg
Ещё нельзя, как в DB2, писать хранимки на любом языке

на Java точно можно, насчет остального не в курсе, не исследовала вопрос

alexeyvg
или нельзя писать хранимки в выражениях операторов реляционного движка СУБД.

не поняла. Например как?
23 авг 11, 14:30    [11164303]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Kateryne
Да я и не наезжаю на скуль, просто очень удивилась, мне казалось оракловое и постгрессовое поведение функций самоочевидным для любой СУБД.
А вот программисту сайбеса и сиквела их поведение самоочевидно :-)
Kateryne
Да вроде бы можно. Или не поняла вас?
Насколько я знаю, в процедуре в оракле нельзя написать просто select * from table, там нужно как то объявлять выходные параметры процедуры (типа OUT SYS_REFCURSOR). Тут я могу конечно ошибаться...

Kateryne
на Java точно можно, насчет остального не в курсе, не исследовала вопрос
В DB2 нельзя написать хранимки кроме как "на любом языке". Там такая же ситуация, как в ОС - можно использовать какой нибуть наиболее подходящий язык программирования.
Только в последнее время ОС (такие как в айфоне) стали похожими на сиквел и оракл и используют специальные языки из предлагаемых производителем ОС :-)

А в оракле и сиквеле можно использовать дополнительные языки именно как дополнения, как Java в оракле или C# в сиквеле. В оракле правда с этим вроде немного получьше...

Kateryne
alexeyvg
или нельзя писать хранимки в выражениях операторов реляционного движка СУБД.
не поняла. Например как?
Ну тоесть используя базовые операторы реляционного движка. Например, сказать - пройти циклом по этим записям, для каждой записи проверить такие то условия...
23 авг 11, 15:53    [11165263]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
alexeyvg
Kateryne
Да я и не наезжаю на скуль, просто очень удивилась, мне казалось оракловое и постгрессовое поведение функций самоочевидным для любой СУБД.
А вот программисту сайбеса и сиквела их поведение самоочевидно :-)
Kateryne
Да вроде бы можно. Или не поняла вас?
Насколько я знаю, в процедуре в оракле нельзя написать просто select * from table, там нужно как то объявлять выходные параметры процедуры (типа OUT SYS_REFCURSOR). Тут я могу конечно ошибаться...

в 9 точно нельзя в более новых версиях незнаю, в своё время напаролся и очень растроился, потому что, простое с точки зрения сиквела решение на оракле вылилось в жуткий гемор с кучей побочного кода.
23 авг 11, 16:52    [11165871]     Ответить | Цитировать Сообщить модератору
 Re: Шокирована - у функций, оказывается, куча ограничений. Или я что-то не догоняю?  [new]
1
Guest
OpenQuery
23 авг 11, 21:16    [11167550]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить