Метод DBMSOUTPUT_LINESARRAY (Oracle) для строки - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы преобразовать массив строковых элементов в одну строку, есть ли способ сделать это?:

select
  cast(
    collect(
      '{' || 
      '"Id":' || to_char(LKP.Id) || ',' ||
      '"descImpuesto":"' || LKP.description ||
      '},'
    ) as sys.DBMSOUTPUT_LINESARRAY
  ) as ARRAY_LKP
from (
  select 1 as id, 'A' as description from dual union all
  select 2, 'B' from dual union all
  select 3, 'C' from dual union all
  select 4, 'D' from dual union all
  select 5, 'E' from dual
  ) LKP

Я использую Oracle 11g базу данных.

Большое спасибо

1 Ответ

2 голосов
/ 07 апреля 2020

Если вы начинаете с существующего массива, вы можете использовать табличное выражение, чтобы получить элементы:

select *
from table (
  select
    cast(
      collect(
        '{' || 
        '"Id":' || to_char(LKP.Id) || ',' ||
        '"descImpuesto":"' || LKP.description ||
        '},'
      ) as sys.DBMSOUTPUT_LINESARRAY
    ) as ARRAY_LKP
  from (
    select 1 as id, 'A' as description from dual union all
    select 2, 'B' from dual union all
    select 3, 'C' from dual union all
    select 4, 'D' from dual union all
    select 5, 'E' from dual
    ) LKP
  )
/

Result Sequence            
---------------------------
{"Id":1,"descImpuesto":"A},
{"Id":2,"descImpuesto":"B},
{"Id":3,"descImpuesto":"C},
{"Id":4,"descImpuesto":"D},
{"Id":5,"descImpuesto":"E},

... и затем объединить их вместе; используя ваш пример в качестве встроенного представления:

select listagg(column_value, null) within group (order by null) AGG_LKP
from table (
  select
    cast(
      collect(
        '{' || 
        '"Id":' || to_char(LKP.Id) || ',' ||
        '"descImpuesto":"' || LKP.description ||
        '},'
      ) as sys.DBMSOUTPUT_LINESARRAY
    ) as ARRAY_LKP
  from (
    select 1 as id, 'A' as description from dual union all
    select 2, 'B' from dual union all
    select 3, 'C' from dual union all
    select 4, 'D' from dual union all
    select 5, 'E' from dual
    ) LKP
  )
/

AGG_LKP                                                                                                                                     
--------------------------------------------------------------------------------------------------------------------------------------------
{"Id":1,"descImpuesto":"A},{"Id":2,"descImpuesto":"B},{"Id":3,"descImpuesto":"C},{"Id":4,"descImpuesto":"D},{"Id":5,"descImpuesto":"E},

Поскольку в ваших значениях массива есть запятые, окончательная строка заканчивается запятой; Вы можете использовать trim(), чтобы избавиться от этого, если не хотите этого. Или, если вы можете опустить его из значений массива, вы можете использовать вместо этого разделитель как часть listagg() (как показано ниже). Так как в вашем примере они все-таки немного искажены, трудно сказать, с чем вы действительно имеете дело.

Если вы только создаете массив для этой цели, вы можете пропустить его и напрямую агрегировать данные:

select
  listagg(
    '{' || 
    '"Id":' || to_char(LKP.Id) || ',' ||
    '"descImpuesto":"' || LKP.description ||
    '}'
  , ',') within group (order by LKP.Id) as AGG_LKP
from (
  select 1 as id, 'A' as description from dual union all
  select 2, 'B' from dual union all
  select 3, 'C' from dual union all
  select 4, 'D' from dual union all
  select 5, 'E' from dual
  ) LKP
/

AGG_LKP                                                                                                                                     
--------------------------------------------------------------------------------------------------------------------------------------------
{"Id":1,"descImpuesto":"A},{"Id":2,"descImpuesto":"B},{"Id":3,"descImpuesto":"C},{"Id":4,"descImpuesto":"D},{"Id":5,"descImpuesto":"E}

listagg() доступен с версии 11g 2.


он не поддерживает более 4000 символов в выводе

Вам необходимо работать с объектами CLOB либо с помощью собственной процедуры создания строки, либо с определяемой пользователем статистической функцией ; или вы можете использовать xmlagg():

select rtrim(
  xmlcast(xmlagg(xmlelement(e,
    '{' || 
    '"Id":' || to_char(LKP.Id) || ',' ||
    '"descImpuesto":"' || LKP.description ||
    '}'
  , ',')) as clob), ',') as AGG_LKP
from (
  select 1 as id, 'A' as description from dual union all
  select 2, 'B' from dual union all
  select 3, 'C' from dual union all
  select 4, 'D' from dual union all
  select 5, 'E' from dual
  ) LKP
/

AGG_LKP                                                                                                                                     
--------------------------------------------------------------------------------------------------------------------------------------------
{"Id":1,"descImpuesto":"A},{"Id":2,"descImpuesto":"B},{"Id":3,"descImpuesto":"C},{"Id":4,"descImpuesto":"D},{"Id":5,"descImpuesto":"E},

Снова агрегация XML оставляет запятую, которую удаляет вызов rtrim().


Это выглядит как будто вы вручную манипулируете данными JSON; Возможно, вы захотите исследовать пакет PL / JSON в качестве альтернативы, поскольку встроенная поддержка JSON не появляется до 12 c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...