Никак не дается мне одна задачка, может кто-нибудь направит на путь истинный (хотябы даже мысли в слух).
Дано:
Хранимая Процедура (ХП) выбора FooProc(id INTEGER)
возвращает набор данных (N строк) из одного столбца для заданного id
Value
-------
value1
value2
...
valueN
ID | Value1 | Value2 |... | ValueN
------------------------------------------
A |value1 |value2 |... | valueN
A+1 |value1 |value2 |... | valueN
...
B |value1 |value2 |... | valueN
В Firebird процедура должна возвращать фиксированное количество столбцов.
На версии 2.1
Можно извернутся с помощью EXECUTE STAIMENT + EXECUTE BLOCK + GTT но мне кажется это ужасный изврат.
Не проще ли выдернуть все данные на клиента и там извращаться?
П.С. В MS SQL & ORACL есть специальная конструкция PIVOT. Я не в курсе насчёт её стандартности.
FOR select
Sum(case when p.TID = '0' then p.PWR end),
Sum(case when p.TID = '1' then p.PWR end),
Sum(case when p.TID = '2' then p.PWR end),
Sum(case when p.TID = '3' then p.PWR end),
Sum(case when p.TID = '4' then p.PWR end),
Sum(case when p.TID = '5' then p.PWR end),
Sum(case when p.TID = '6' then p.PWR end),
Sum(case when p.TID = '7' then p.PWR end),
Sum(case when p.TID = '8' then p.PWR end),
Sum(case when p.TID = '9' then p.PWR end),
Sum(case when p.TID = '10' then p.PWR end),
Sum(case when p.TID = '11' then p.PWR end),
Sum(case when p.TID = '12' then p.PWR end),
Sum(case when p.TID = '13' then p.PWR end),
Sum(case when p.TID = '14' then p.PWR end),
Sum(case when p.TID = '15' then p.PWR end),
Sum(case when p.TID = '16' then p.PWR end),
Sum(case when p.TID = '17' then p.PWR end),
Sum(case when p.TID = '18' then p.PWR end),
Sum(case when p.TID = '19' then p.PWR end),
Sum(case when p.TID = '20' then p.PWR end),
Sum(case when p.TID = '21' then p.PWR end),
Sum(case when p.TID = '22' then p.PWR end),
Sum(case when p.TID = '23' then p.PWR end)
from P_HOURLYPWR(:pointid, :indate) p
INTO :f00, :f01, :f02, :f03, :f04, :f05, :f06, :f07, :f08, :f09, :f10, :f11, :f12, :f13, :f14, :f15, :f16, :f17, :f18, :f19, :f20, :f21, :f22, :f23
...
да вы батенька, извращенец!
kuler, а на более умную фразу знаний наскребешь?
ну а если бы там было не 23 а 1023?
возвращать
A
val1
...
valn
A+1
val1
...
valn
...
преобразование на стороне клиента будет простейшим
короче врядли sql предназначен для вывода большого множества столбцов а уж тем более переменного, это использование не по назначению. СУБД это не оперативная память где как хочешь измерения фигаришь
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)