Oracle11g 方法DBMSOUTPUT_LINESARRAY(Oracle)到字符串

Oracle11g 方法DBMSOUTPUT_LINESARRAY(Oracle)到字符串,oracle11g,Oracle11g,我想将一个字符串元素数组转换成一个字符串,有什么方法吗 select cast( collect( '{' || '"Id":' || to_char(LKP.Id) || ',' || '"descImpuesto":"' || LKP.description || '},' ) as sys.DBMSOUTPUT_LINESARRAY ) as ARRAY_LKP from ( select 1 as id, 'A

我想将一个字符串元素数组转换成一个字符串,有什么方法吗

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
我正在使用Oracle11g数据库


非常感谢

如果从现有数组开始,可以使用表表达式获取元素:

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()
来摆脱它。或者,如果可以从数组值中省略它,则可以使用分隔符作为
listag()
的一部分(如下所示)。因为它们在您的示例中有点不正确,所以很难判断您真正在处理什么

如果仅为此目的创建阵列,则可以跳过它并直接聚合数据:

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}
listag()
可从11g第2版获得


它的输出不支持超过4000个字符

您需要使用CLOB,或者通过您自己的过程来构建字符串,或者使用CLOB;或者您可以使用
xmlagg()

XML聚合同样会留下一个尾随逗号,
rtrim()
调用会删除该逗号



看起来您正在手动操作JSON数据;您可能希望作为一种替代方法进行研究,因为JSON的本机支持直到12c才出现。

如果您从现有数组开始,则可以使用表表达式来获取元素:

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()
来摆脱它。或者,如果可以从数组值中省略它,则可以使用分隔符作为
listag()
的一部分(如下所示)。因为它们在您的示例中有点不正确,所以很难判断您真正在处理什么

如果仅为此目的创建阵列,则可以跳过它并直接聚合数据:

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}
listag()
可从11g第2版获得


它的输出不支持超过4000个字符

您需要使用CLOB,或者通过您自己的过程来构建字符串,或者使用CLOB;或者您可以使用
xmlagg()

XML聚合同样会留下一个尾随逗号,
rtrim()
调用会删除该逗号



看起来您正在手动操作JSON数据;您可能希望作为替代方案进行调查,因为对JSON的本机支持直到12c才出现。

您是否有一个必须操作的现有的
DBMSOUTPUT\u LINESARRAY
,或者您是否按照所显示的方式创建它,并立即希望它采用不同的格式?i、 e.
DBMSOUTPUT\u LINESARRAY
是实际需要的还是您认为您需要的?您是否有一个必须操作的现有
DBMSOUTPUT\u LINESARRAY
,或者您正在按照显示的方式创建它,并且立即想要一个不同的格式?i、 e.
DBMSOUTPUT_LINESARRAY
是您真正需要的还是您认为您需要的?非常感谢Alex。使用Listag是我解决查询的第一种方法之一,但不幸的是,它的输出中不支持超过4000个字符,因此它不符合我的需要。对,但这是varchar2的限制,因此无论您如何尝试形成最终字符串,您都会找到它。您需要从查询数据并逐个元素构建CLOB的存储过程生成CLOB,或者使用。有一个示例,您可以将其转换为使用CLOB。但我还是要看看PL/JSON…@JaimeDrq-添加了一种可能适合您的XML技术。非常感谢@Alex对您的支持。事实上,只要使用一个简单的to_char方法,xmlcast就可以转换为字符串。但是,我已经看到,与DBMSOUTPUT_LINESARRAY对象相比,xmlcast的执行速度要慢得多,因此即使答案对我的问题有效,我也无法使用它,因为它的性能很慢。DBMSOUTPUT_LINESARRAY大约需要4秒才能返回一个查询,而使用xmlcast大约需要45秒才能返回相同的输出。非常感谢您。使用Listag是我解决查询的第一种方法之一,但不幸的是,它的输出中不支持超过4000个字符,因此它不符合我的需要。对,但这是varchar2的限制,因此无论您如何尝试形成最终字符串,您都会找到它。您需要从查询数据并逐个元素构建CLOB的存储过程生成CLOB,或者使用。有一个示例,您可以将其转换为使用CLOB。但我还是要看看PL/JSON…@JaimeDrq-添加了一种可能适合您的XML技术。非常感谢@Alex对您的支持。事实上,只要使用一个简单的to_char方法,xmlcast就可以转换为字符串。但是,我已经看到,与DBMSOUTPUT_LINESARRAY对象相比,xmlcast的执行速度要慢得多,因此即使答案对我的问题有效,我也无法使用它,因为它的性能很慢。DBMSOUTPUT_LINESARRAY大约需要4秒才能返回一个查询,而使用xmlcast大约需要45秒才能返回相同的输出