方法 DBMSOUTPUT_LINESARRAY (Oracle) 到字符串
Method DBMSOUTPUT_LINESARRAY (Oracle) to string
我想将一个字符串元素数组转换成一个字符串,有什么办法吗?:
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 数据库。
非常感谢
如果您从现有数组开始,您可以使用 table 表达式来获取元素:
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 版开始可用。
it doesn't support more than 4000 characters in its output
您需要使用 CLOB,或者通过您自己的过程来构建字符串,或者使用 user-defined aggregate function;或者你可以使用 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数据;您可能想调查 the PL/JSON package 作为替代方案,因为对 JSON 的原生支持直到 12c 才出现。
我想将一个字符串元素数组转换成一个字符串,有什么办法吗?:
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 数据库。
非常感谢
如果您从现有数组开始,您可以使用 table 表达式来获取元素:
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 版开始可用。
it doesn't support more than 4000 characters in its output
您需要使用 CLOB,或者通过您自己的过程来构建字符串,或者使用 user-defined aggregate function;或者你可以使用 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数据;您可能想调查 the PL/JSON package 作为替代方案,因为对 JSON 的原生支持直到 12c 才出现。