Перестроение запроса
Перестроение запроса
Добрый день .
Помогите пожалуйста разобратся с такой проблемой :
Есть простенький запрос
SELECT NAME_LAST , NAME_FIRST, NAME_MIDDLE
from Table
WHERE .....
Запрос возвращает не более 4-х записей . Вопрос следующий :
Каким образом результат
------------------------------------------------------
NAME_LAST | NAME_FIRST | NAME_MIDDLE |
------------------------------------------------------
Name_L_1 | Name_F_1 | Name_M_1 |
Name_L_2 | Name_F_2 | Name_M_2 |
Представить в виде ОДНОЙ строки такого типа :
Name_L_1 Name_F_1 Name_M_1 , Name_L_2 Name_F_2 Name_M_2
Заранее благодарен .
Помогите пожалуйста разобратся с такой проблемой :
Есть простенький запрос
SELECT NAME_LAST , NAME_FIRST, NAME_MIDDLE
from Table
WHERE .....
Запрос возвращает не более 4-х записей . Вопрос следующий :
Каким образом результат
------------------------------------------------------
NAME_LAST | NAME_FIRST | NAME_MIDDLE |
------------------------------------------------------
Name_L_1 | Name_F_1 | Name_M_1 |
Name_L_2 | Name_F_2 | Name_M_2 |
Представить в виде ОДНОЙ строки такого типа :
Name_L_1 Name_F_1 Name_M_1 , Name_L_2 Name_F_2 Name_M_2
Заранее благодарен .
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Вот код моей процедуры:
Но возвращает она все равно не одну строку
если запрос имеет
----------------------------------------------------
Name_Last | Name_First | Name_Middle |
----------------------------------------------------
Name_L_1 Name_F_1 Name_M_1
Name_L_2 Name_F_2 Name_M_2
То процедура возвращает
Name_L_1 Name_F_1 Name_M_1
Name_L_1 Name_F_1 Name_M_1 Name_L_2 Name_F_2 Name_M_2
А если в процедуре написать
OUTPUT_STRING || ', ' || :NL || (поставить через запятую, как советовал ув. Dimitry Sibiryakov то вываливается arithmetic exeption... )
Код: Выделить всё
CREATE PROCEDURE PARENTS_STR (
ID INTEGER)
RETURNS (
OUTPUT_STRING VARCHAR(200))
AS
DECLARE VARIABLE NL VARCHAR(60);
DECLARE VARIABLE NF VARCHAR(30);
DECLARE VARIABLE NM VARCHAR(30);
BEGIN
OUTPUT_STRING='';
FOR
select p.Name_Last || ' ' as NL , p.name_first || ' ' as NF, p.name_middle || ' ' as NM
from PERSONS p
left join relatives r on p.id=r.id_child
WHERE p.ID in
(SELECT ID_PARENT FROM relatives WHERE ID_CHILD=:ID )
INTO :NL,
:NF,
:NM
DO
BEGIN
OUTPUT_STRING = OUTPUT_STRING || :NL || :NF || :NM ;
SUSPEND;
END
END

если запрос имеет
----------------------------------------------------
Name_Last | Name_First | Name_Middle |
----------------------------------------------------
Name_L_1 Name_F_1 Name_M_1
Name_L_2 Name_F_2 Name_M_2
То процедура возвращает
Name_L_1 Name_F_1 Name_M_1
Name_L_1 Name_F_1 Name_M_1 Name_L_2 Name_F_2 Name_M_2
А если в процедуре написать
OUTPUT_STRING || ', ' || :NL || (поставить через запятую, как советовал ув. Dimitry Sibiryakov то вываливается arithmetic exeption... )
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Если почитать справку , то иногда помогает ...
Исключения при выполнении убираются путем присваивания CHARACTER SET переменным и результату , а если убрать suspend за рпеделы цикла то возвращатся будет именно ОДНА строка ...
Спасибо всем за ответы .
Отдельное спавибо Dimitry Sibiryakov за строку

Исключения при выполнении убираются путем присваивания CHARACTER SET переменным и результату , а если убрать suspend за рпеделы цикла то возвращатся будет именно ОДНА строка ...
Спасибо всем за ответы .
Отдельное спавибо Dimitry Sibiryakov за строку
Иногда и такие напутствия помогаютнайди три отличия от решения aaa3d и получи счастье

Код: Выделить всё
CREATE PROCEDURE PARENTS_STR (
ID INTEGER)
RETURNS (
OUTPUT_STRING VARCHAR(500) CHARACTER SET win1251)
AS
DECLARE VARIABLE NL VARCHAR(60) CHARACTER SET WIN1251;
DECLARE VARIABLE NF VARCHAR(30) CHARACTER SET WIN1251;
DECLARE VARIABLE NM VARCHAR(30) CHARACTER SET WIN1251;
BEGIN
OUTPUT_STRING='';
FOR
select p.Name_Last as NL , p.name_first as NF, p.name_middle as NM
from PERSONS p
left join relatives r on p.id=r.id_child
WHERE p.ID in
(SELECT ID_PARENT FROM relatives WHERE ID_CHILD=:ID )
INTO :NL,
:NF,
:NM
DO
BEGIN
if (OUTPUT_STRING = '' ) then OUTPUT_STRING = :NL||' '|| :NF||' '||:NM;
else OUTPUT_STRING = OUTPUT_STRING||', '||:NL||' '||:NF||' '||:NM;
END
suspend;
END