Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры в селекте / 25 сообщений из 25, страница 1 из 1
29.10.2014, 08:59
    #38790164
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
Добрый день! Такая ситуация, к примеру запрос по заказам, в каждом заказе по несколько товаров, надо вывести номера заказов и наименования товаров в заказе через строку.
В oracle это решается просто
Код: plsql
1.
2.
3.
SELECT T.ZAKAZ Z_NUM,
           GET_ZAKAZ_TOVAR_STR(T.ZAKAZ) DETAILS_STR
      FROM ZAKAZ T


где GET_ZAKAZ_TOVAR_STR - хранимая функция, которая просто в цикле склеивает наименования товаров по ID заказа.

Я так понял в Firebird нет хранимых функций? Как быть? Создавать UDF или можно хранимую процедуру с выходным параметром? В таком случае как тогда делать вызов в селекте?
...
Рейтинг: 0 / 0
29.10.2014, 09:00
    #38790166
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchikЯ так понял в Firebird нет хранимых функций?
Куда они делись?

http://www.firebirdsql.org/refdocs/langrefupd21-ddl-procedure.html
...
Рейтинг: 0 / 0
29.10.2014, 09:01
    #38790167
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
...
Рейтинг: 0 / 0
29.10.2014, 10:05
    #38790265
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadman,
по ссылке же процедуры хранимые
...
Рейтинг: 0 / 0
29.10.2014, 10:09
    #38790274
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchikпо ссылке же процедуры хранимые
Они-же функции. Все таки потрудись почитать русскую доку, люди старались...
...
Рейтинг: 0 / 0
29.10.2014, 10:13
    #38790283
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadman,

что мне должно дать чтение http://www.sql.ru/forum/1123374/ann-rukovodstvo-po-yazyku-sql-subd-firebird ? прояснить как создавать UDF?
...
Рейтинг: 0 / 0
29.10.2014, 10:14
    #38790287
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchikчто мне должно дать чтение http://www.sql.ru/forum/1123374/ann-rukovodstvo-po-yazyku-sql-subd-firebird] http://www.sql.ru/forum/1123374/ann-rukovodstvo-po-yazyku-sql-subd-firebird? прояснить как создавать UDF?
https://www.assembla.com/spaces/firebird-russian-documentation/documents/cg4MPuxBCr5j1WacwqEsg8/download/cg4MPuxBCr5j1WacwqEsg8]Так доступнее?
...
Рейтинг: 0 / 0
29.10.2014, 10:14
    #38790289
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadmanaidynchikпо ссылке же процедуры хранимые
Они-же функции. Все таки потрудись почитать русскую доку, люди старались...
Функции только в FB3. Это в доке написано?
...
Рейтинг: 0 / 0
29.10.2014, 10:15
    #38790293
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadmanaidynchikчто мне должно дать чтение http://www.sql.ru/forum/1123374/ann-rukovodstvo-po-yazyku-sql-subd-firebird] http://www.sql.ru/forum/1123374/ann-rukovodstvo-po-yazyku-sql-subd-firebird? прояснить как создавать UDF?
https://www.assembla.com/spaces/firebird-russian-documentation/documents/cg4MPuxBCr5j1WacwqEsg8/download/cg4MPuxBCr5j1WacwqEsg8]Так доступнее?
Ёма... Форум не понимает https? https://www.assembla.com/spaces/firebird-russian-documentation/documents/cg4MPuxBCr5j1WacwqEsg8/download/cg4MPuxBCr5j1WacwqEsg8 кликай сюда.
...
Рейтинг: 0 / 0
29.10.2014, 10:15
    #38790294
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadman,
не мути воду. Хранимые функции появились только в ФБ3.

aidynchik,
что мешает использовать в селектах хранимые процедуры, через подзапросы?
...
Рейтинг: 0 / 0
29.10.2014, 10:15
    #38790295
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadman,

сижу читаю, но что там про вызов процедур из селекта... я нашел только "Хранимая процедура (ХП) – это программный модуль, который может быть вызван с клиента, из другой процедуры, выполнимого блока (executable block) или триггера."
...
Рейтинг: 0 / 0
29.10.2014, 10:16
    #38790297
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
NickDeewadmanпропущено...

Они-же функции. Все таки потрудись почитать русскую доку, люди старались...
Функции только в FB3. Это в доке написано?
Ась? Здрасьте, тролль.

Код: sql
1.
2.
3.
SELECT T.ZAKAZ Z_NUM,
           (select some_val from GET_ZAKAZ_TOVAR_STR(T.ZAKAZ)) DETAILS_STR
FROM ZAKAZ T
...
Рейтинг: 0 / 0
29.10.2014, 10:17
    #38790300
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
dimitrХранимые функции появились только в ФБ3.
Особой разницы между процедурами и функциями не вижу.
...
Рейтинг: 0 / 0
29.10.2014, 10:17
    #38790301
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
dimitrчто мешает использовать в селектах хранимые процедуры, через подзапросы?

можно пример? мне не совсем понятно, я на firebird не очень-то
...
Рейтинг: 0 / 0
29.10.2014, 10:21
    #38790306
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchik,

создание UDF к SQL не относится. Только объявление.

Как использовать хранимые процедуры вместо хранимых функций там нет примера. Ничего добавлю.

Хочешь хранимые функции бери Firebird 3, но он пока Beta
...
Рейтинг: 0 / 0
29.10.2014, 10:24
    #38790311
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadman,

спасибо за пример! можно было и сразу так ответить, а не тыкать ссылками :)
...
Рейтинг: 0 / 0
29.10.2014, 10:48
    #38790344
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchikwadman,

спасибо за пример! можно было и сразу так ответить, а не тыкать ссылками :)
wadman вас просто дружелюбно тролльнул :) В следующий раз вы кого-нить тут так же тролльнёте, тот следующего, и жизнь трольнячья закипит :)
...
Рейтинг: 0 / 0
29.10.2014, 11:40
    #38790438
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
Код: sql
1.
2.
3.
SELECT T.ZAKAZ Z_NUM,
           ZZ.some_val DETAILS_STR
FROM ZAKAZ T left join GET_ZAKAZ_TOVAR_STR(T.ZAKAZ) ZZ on 1=1



NickDeeтролльнул :)Ща кое-кто па-дружески отправится в ридонли.
...
Рейтинг: 0 / 0
29.10.2014, 11:44
    #38790451
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
wadmanОсобой разницы между процедурами и функциями не вижу.
А она есть. Теоретически функции должны быть быстрее, а по факту странное поведение.
speed test
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
execute block
as
declare variable n integer;
begin
  select sum(1) from generate_serial(1, 1000000) into :n;
end
--Execute time = 967ms

execute block
as
declare procedure prc returns(n integer) as
                        begin
                          n = 1;
                          suspend;
                        end
declare variable n integer;
begin
  select sum((select n from prc)) from generate_serial(1, 1000000) into :n;
end
--Execute time = 952ms

execute block
as
declare function func returns integer as
                        begin
                          return 1;
                        end
declare variable n integer;
begin
  select sum(func()) from generate_serial(1, 1000000) into :n;
end
-- Execute time = 2s 340ms

-------------------------------------------
create or alter procedure GENERATE_SERIAL (
    from_value integer,
    to_value integer,
    step integer = 1)
returns (
    id integer)
as
begin
  id = from_value;
  while (id <= to_value) do
  begin
    suspend;
    id = id + step;
  end
end

...
Рейтинг: 0 / 0
29.10.2014, 11:44
    #38790452
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchikгде GET_ZAKAZ_TOVAR_STR - хранимая функция, которая просто в цикле
склеивает наименования товаров по ID заказа.
А в Firebird для этого есть стандартная функция LIST() и не надо изобретать велосипед.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.10.2014, 11:51
    #38790468
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
afgm,

если объявишь функцию как deterministic будет быстрее.

Могу лишь предположить что некоррелированный подзапрос материализуется.
...
Рейтинг: 0 / 0
29.10.2014, 12:01
    #38790491
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
Симонов Денисесли объявишь функцию как deterministic будет быстрее.
В данном примере да, можно.
Симонов ДенисМогу лишь предположить что некоррелированный подзапрос материализуется.
Похоже на то.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
execute block
as
declare procedure prc(par1 int) returns(n integer) as
                        begin
                          n = 1;
                          suspend;
                        end
declare variable n integer;
begin
  select sum((select n from prc(g.id))) from generate_serial(1, 1000000) g into :n;
end
-- Execute time = 3s 728ms

execute block
as
declare function func(par1 int) returns integer as
                        begin
                          return 1;
                        end
declare variable n integer;
begin
  select sum(func(g.id)) from generate_serial(1, 1000000) g into :n;
end
-- Execute time = 2s 652ms

...
Рейтинг: 0 / 0
31.10.2014, 13:33
    #38792898
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
Dimitry Sibiryakovaidynchikгде GET_ZAKAZ_TOVAR_STR - хранимая функция, которая просто в цикле
склеивает наименования товаров по ID заказа.
А в Firebird для этого есть стандартная функция LIST() и не надо изобретать велосипед.

оооооо, спасибо!
...
Рейтинг: 0 / 0
31.10.2014, 13:52
    #38792924
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
aidynchikоооооо, спасибо!
Только порядок строк в результате произвольный
...
Рейтинг: 0 / 0
31.10.2014, 15:09
    #38793060
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры в селекте
Шавлюк ЕвгенийТолько порядок строк в результате произвольныйобычный воркэраунд обернуть снаружи еще одним селектом, а во внутреннем требуемый ордер бай.
aidynchikооооооА если еще и доку почитать, то там открытий чудных нас ждет, огого!
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры в селекте / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]