powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как обьединить результат запроса в одну строчку через запятую
25 сообщений из 40, страница 1 из 2
как обьединить результат запроса в одну строчку через запятую
    #38039168
qwerty2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как обьединить результат запроса в одну строчку через запятую


допустим select text from table
выдет так
1 text
2 text
3 text

а мне нужно
1 text,text,text
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039175
stil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039182
qwerty2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спс конкат сработал
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039198
qwerty2012,

только смотри, чтобы при установке очередного патча у тебя на выходе с неё CLOB не получился....
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039205
qwerty2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а тогда может попробовать написать функцию которой буду передавать селект, а она будет в одну строчку все соединять
тока вот не знаю как в функцию результат запроса передать
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039221
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty2012тока вот не знаю как в функцию результат запроса передать
курсор
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039222
stil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty2012спс конкат сработал

Прочитайте и про то и про другое - и там и там есть подводные камни. например wm_concat - недокументируемая функция и как Вам уже сказали - в разных версиях oracle - у нее разный тип возврата. Для 10.2.0,5 и 11g - это clob, для более старых - VARCHAR2
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039256
qwerty2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create or replace function Table_count (My_Table in varchar2)
return varchar2
is
n number;
s varchar(1000);
begin
s:= 'select text from '||My_Table;
execute immediate s;
return n;
end;

как пройти по результату запроса и сконтенировать все его строки?
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039271
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty2012,
авторкак пройти по результату запроса и сконтенировать все его строки?
так же 13476291 for
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039274
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty2012,

и туда же ТОП 14
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039287
qwerty2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о чем ты говоришь 123ий???



create or replace function ListName(p1 number) return varchar2 is
Result varchar2;
begin
open p_cursor FOR
select text from table where id=p1 ;
return(Result);
end ListName;

как по курсору теперь пробежаться?
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039301
qwerty2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create or replace function ListName(p1 number) return varchar2 is
Result varchar2;
begin
open p_cursor FOR
select text from table where id=p1 ;
LOOP
FETCH p_cursor INTO l_num;
EXIT WHEN p_cursor % notfound;
Result:=Result+l_num.text;
END LOOP;
CLOSE p_cursor;
return(Result);
end ListName;
так правельно?
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039311
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty2012,

да прочтите наконец документацию или посмотрите ТОП 14
Код: plsql
1.
2.
3.
4.
for cr in (select text from table where id=p1) loop
  Result :=Result||cr.text||','
end loop;
  return RTrim(Result,',');
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039329
наваять
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stil,
снкс за wm_concat

аккурат вчера убил кучку времени, на
правда при больше 32k имеем
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
/*
ORA-22813: значение операнда превышает системный лимит
22813. 00000 -  "operand value exceeds system limits"
*Cause:    Object or Collection value was too large. The size of the value
           might have exceeded 30k in a SORT context, or the size might be
           too big for available memory.
*Action:   Choose another value and retry the operation.
*/



(с LISTAGG имеем то же [кажется] ещё раньше [4000]:
Код: plsql
1.
--01489. 00000 -  "result of string concatenation is too long"


)

но если целенаправленно лезть в CLOB то вот такое например можно наваять на коленке:
Код: plsql
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
create or replace type STRING_TOAGG_TYPE as object
(
-- Purpose : Passes parameters to the string_aggr_type's ODCIAggregateIterate function
-- Attributes
strvalue CLOB, -- varchar2(4000), --32767-plsql -CLOB --sql
separator varchar2(100)
-- Member functions and procedures
-- N.a.
)
/


create or replace type string_aggr_type as object (
 total CLOB , -- varchar2(4000),  --32767-plsql -CLOB --sql
static function ODCIAggregateInitialize(sctx IN OUT string_aggr_type )
 return number,
member function ODCIAggregateIterate(self IN OUT string_aggr_type ,
                                     value IN STRING_TOAGG_TYPE) return number,
member function ODCIAggregateTerminate(self IN string_aggr_type,
                                       returnValue OUT  CLOB, -- varchar2,
                                       flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT string_aggr_type,
                                   ctx2 IN string_aggr_type) return number
);
/
create or replace type body string_aggr_type is

  static function ODCIAggregateInitialize(sctx IN OUT string_aggr_type)
    return number is
  begin
    sctx := string_aggr_type(null);
    return odciconst.success;
  end;
member function ODCIAggregateIterate(self  IN OUT string_aggr_type,
                                     value IN STRING_TOAGG_TYPE) return number is
  begin
    self.total :=
     --можно целенаправленно резать, дабы не вылезать за    
     /* CASE WHEN length(self.total) + length(value.strvalue)+length(value.separator) >= 32767 THEN
        SUBSTR(self.total,0,32763)||'...' --*/  --32767-plsql -CLOB --sql
      /*CASE WHEN length(self.total) + length(value.strvalue)+length(value.separator) >= 4000 THEN
        SUBSTR(self.total,0,3996)||'...'*/
      --ELSE
        CASE WHEN value.strvalue IS NULL THEN self.total
          ELSE 
            CASE WHEN self.total IS NULL THEN NULL  ELSE self.total || value.separator END || value.strvalue
          END
      --END
      ;
    return odciconst.success;
   end;
member function ODCIAggregateTerminate(self        IN string_aggr_type,
                                       returnvalue OUT CLOB, -- varchar2,
                                       flags       IN number
                                      ) return number is
  begin
    returnvalue := self.total; -- ltrim(self.total, ',');
    return odciconst.success;
  end;
member function ODCIAggregateMerge(self IN OUT string_aggr_type,
                                   ctx2 IN string_aggr_type) return number is
  begin
    self.total := self.total || ctx2.total;
    return odciconst.success;
  end;
end;
/
CREATE or replace FUNCTION string_agg(input STRING_TOAGG_TYPE) RETURN CLOB --varchar2
  PARALLEL_ENABLE
  AGGREGATE USING string_aggr_type;
/

-- test
with t as
( select 'a_'||rownum val from dual
CONNECT BY rownum<8000
)
select string_agg(STRING_TOAGG_TYPE(val,'<br>')) as val
,length(string_agg(STRING_TOAGG_TYPE(val,'<br>'))) as length
from t;
--7.16second --length = 78879


-- видим, затраты на то, чтобы получить одну длинную строку великоваты. т.ч. разве что факультативный интерес.
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039338
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наваятьвидим, затраты на то, чтобы получить одну длинную строку великоваты. т.ч. разве что факультативный интерес.clob_agg получается из str_agg буквально заменой пары слов. Если тебе нужна производительность, то убери STRING_TOAGG_TYPE и сравни еще раз. Входной параметр в обоих случаях - varchar2.
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039370
hexcept
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with u as
(
 select '1 text' text from dual union all
 select '2 text' from dual union all
 select '3 text' from dual union all
 select 'bla-bla-bla' from dual
)
select
 ltrim(rtrim(regexp_replace(
  cast(xmlagg(xmlelement("_",u.text)) as varchar2(2000)),
  '(</?_>)+',','),','),',') str
from u
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039384
наваять
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopнаваятьвидим, затраты на то, чтобы получить одну длинную строку великоваты. т.ч. разве что факультативный интерес.clob_agg получается из str_agg буквально заменой пары слов. Если тебе нужна производительность, то убери STRING_TOAGG_TYPE и сравни еще раз. Входной параметр в обоих случаях - varchar2.зачем мне производительность без комфорта - той же опции смены разделителя ?
сначала отпилим ноги по колено - потом заставим с этим жыть -- типичный оракел стайл

а то что заменой пары слов - так так вы это верно подметили, так и получено
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039427
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наваять,

Код: plsql
1.
clob_agg(column||'<br>')
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039478
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наваять,

По поводу избыточных конструкторов Никотин когда-то писал 12044200 .
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039601
наваять
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopнаваять,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
-- ну давайте дальше усложнять вызов
clob_agg(CASE WHEN NOT column IS NULL THEN column||'<br>' END)
-- и кто отрезать ему дефолтные ','|', ' будет? пупкин
-- или clob_agg пойдёт уже без этого избыточного сервиса ?
-- ну и последний separator ещё ручками всякий раз отпиливать

"спасибо, я лучше пешком постою"
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38039691
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наваятьdbms_photoshopнаваять,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
-- ну давайте дальше усложнять вызов
clob_agg(CASE WHEN NOT column IS NULL THEN column||'<br>' END)
-- и кто отрезать ему дефолтные ','|', ' будет? пупкин
-- или clob_agg пойдёт уже без этого избыточного сервиса ?
-- ну и последний separator ещё ручками всякий раз отпиливать

"спасибо, я лучше пешком постою"

Ты прав, эта конструкция крайне сложна и додуматься ой как непросто.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> select length(rtrim(clob_agg('a_'||rownum||'<br>'),'<br>')) len from dual connect by rownum < 8000;

       LEN
----------
     78879

Elapsed: 00:00:03.00
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38040456
убил,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopнаваятьпропущено...
Ты прав, эта конструкция крайне сложна и додуматься ой как непросто.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> select length(rtrim(clob_agg('a_'||rownum||'<br>'),'<br>')) len from dual connect by rownum < 8000;

       LEN
----------
     78879

Elapsed: 00:00:03.00
-- Это микросекунды ?
-- если да - то убил :0)




теперь обвесь это всё проверкой на null, -- в общем случае, а не в случае теста, добавь таки вывод самой строки, и сравним наши микросекунды
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38040482
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
убил,,

Поинт был в том, что вполне можно обойтись без конструирования объекта пользовательского типа для каждой строки.
Но похоже это не для твоего ума.
Тайминг просто скопировался из SQL*Plus. Ясно что сравнивать тайминги на разных серверах нет никакого смысла.
Впрочем, ты можешь писать любой говногод и как угодно тупить... дело твое.
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38081735
dbms_photoshop,
ты не мудри,
пойнт, млин оно нашло хехехе




PS: ты вот лучше скажы, есть ли у вас, у быдлокоидов ораклоидов однообразный способ навязать агрегату порядок агрегирования
или опять только вымороченным частным LISTAGG пользоваться? а в общем случае типа внятного
Код: plsql
1.
SELECT f_agg(val ORDER BY {list_order}) FROM xxx


эта ваша допотопная хреновина не обучена ? многомуд..рый Оракел умеет ?

они чо там, в оракле, не допускали неперестановочных (некоммутативных) агрегатов ?
и так и будут для каждого нового агрегата свой собственный синтаксис рожать ?
...
Рейтинг: 0 / 0
как обьединить результат запроса в одну строчку через запятую
    #38082859
не зли меняоднообразный способ навязать агрегату порядок агрегирования

про использование в агрегатах конструкции within group (order by ...) читать не пробовал?
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как обьединить результат запроса в одну строчку через запятую
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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