Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как обьединить результат запроса в одну строчку через запятую / 25 сообщений из 40, страница 1 из 2
15.11.2012, 09:15
    #38039168
qwerty2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обьединить результат запроса в одну строчку через запятую
как обьединить результат запроса в одну строчку через запятую


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

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

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

Прочитайте и про то и про другое - и там и там есть подводные камни. например wm_concat - недокументируемая функция и как Вам уже сказали - в разных версиях oracle - у нее разный тип возврата. Для 10.2.0,5 и 11g - это clob, для более старых - VARCHAR2
...
Рейтинг: 0 / 0
15.11.2012, 10:18
    #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
15.11.2012, 10:29
    #38039271
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обьединить результат запроса в одну строчку через запятую
qwerty2012,
авторкак пройти по результату запроса и сконтенировать все его строки?
так же 13476291 for
...
Рейтинг: 0 / 0
15.11.2012, 10:31
    #38039274
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обьединить результат запроса в одну строчку через запятую
qwerty2012,

и туда же ТОП 14
...
Рейтинг: 0 / 0
15.11.2012, 10:41
    #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
15.11.2012, 10:47
    #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
15.11.2012, 10:50
    #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
15.11.2012, 11:05
    #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
15.11.2012, 11:14
    #38039338
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обьединить результат запроса в одну строчку через запятую
наваятьвидим, затраты на то, чтобы получить одну длинную строку великоваты. т.ч. разве что факультативный интерес.clob_agg получается из str_agg буквально заменой пары слов. Если тебе нужна производительность, то убери STRING_TOAGG_TYPE и сравни еще раз. Входной параметр в обоих случаях - varchar2.
...
Рейтинг: 0 / 0
15.11.2012, 11:30
    #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
15.11.2012, 11:38
    #38039384
наваять
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обьединить результат запроса в одну строчку через запятую
dbms_photoshopнаваятьвидим, затраты на то, чтобы получить одну длинную строку великоваты. т.ч. разве что факультативный интерес.clob_agg получается из str_agg буквально заменой пары слов. Если тебе нужна производительность, то убери STRING_TOAGG_TYPE и сравни еще раз. Входной параметр в обоих случаях - varchar2.зачем мне производительность без комфорта - той же опции смены разделителя ?
сначала отпилим ноги по колено - потом заставим с этим жыть -- типичный оракел стайл

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

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

По поводу избыточных конструкторов Никотин когда-то писал 12044200 .
...
Рейтинг: 0 / 0
15.11.2012, 13:07
    #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
15.11.2012, 13:45
    #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
15.11.2012, 20:11
    #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
15.11.2012, 20:42
    #38040482
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обьединить результат запроса в одну строчку через запятую
убил,,

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




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


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

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

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


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