You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX中查询XMLType数据并显示为文本,应使用什么元素?

在Oracle APEX中显示格式化XML的合适元素

需求:查询原始XML格式数据并以带缩进的结构化文本形式显示,当前使用动态内容元素时显示为无格式单行文本,尝试Textarea元素出现错误,需找到合适的显示元素。

使用的SQL查询语句:

select xmlroot(
    xmlelement("vozidlo",
        xmlattributes(
            a.vyrobne_cislo as "vin",
            a.datum_vyroby as "dat_vyroby"
        ),
        xmlforest(
            c.nazov as "vyrobca",
            a.nazov_modelu as "model",
            a.farba as "farba",
            rtrim(a.kod_motora) as "kod_motor",
            rtrim(a.kod_prevodovky) as "kod_prevodovka",
            d.popis as "typ_karoserie",
            xmlagg(
                xmlelement("zaznam",
                    xmlattributes (
                        g.datum as "datum"
                    ),
                    xmlforest(
                        g.akcia as "popis",
                        g.kilometre as "kilometre"
                    )
                ) order by g.kilometre
            ) as "zaznamy"
        )
    )
, version '1.0') result
from vozidlo a
join model b on a.typ_karoserie = b.typ_karoserie
    and a.nazov_modelu = b.nazov_modelu
    and a.id_vyrobcu = b.id_vyrobcu
join vyrobca c on b.id_vyrobcu = c.id_vyrobcu
join typ_karoserie d on d.id_typu = b.typ_karoserie
left join (
    select e.vyrobne_cislo, f.datum, f.akcia, f.kilometre
    from vozidlo e, table(e.zaznamy) f) g on g.vyrobne_cislo = a.vyrobne_cislo
where a.vyrobne_cislo = :P7_VIN_VOZIDLA
group by a.vyrobne_cislo, a.datum_vyroby, c.nazov, a.nazov_modelu, a.farba, a.kod_motora, a.kod_prevodovky, d.popis
fetch first row only;

解决步骤

1. 先让SQL返回格式化的XML(关键)

当前查询返回的是未格式化的XMLType,需要用XMLSERIALIZE函数将其转换为带缩进的CLOB,修改后的SQL如下:

select XMLSERIALIZE(
    DOCUMENT xmlroot(
        xmlelement("vozidlo",
            xmlattributes(
                a.vyrobne_cislo as "vin",
                a.datum_vyroby as "dat_vyroby"
            ),
            xmlforest(
                c.nazov as "vyrobca",
                a.nazov_modelu as "model",
                a.farba as "farba",
                rtrim(a.kod_motora) as "kod_motor",
                rtrim(a.kod_prevodovky) as "kod_prevodovka",
                d.popis as "typ_karoserie",
                xmlagg(
                    xmlelement("zaznam",
                        xmlattributes (
                            g.datum as "datum"
                        ),
                        xmlforest(
                            g.akcia as "popis",
                            g.kilometre as "kilometre"
                        )
                    ) order by g.kilometre
                ) as "zaznamy"
            )
        )
    , version '1.0')
    AS CLOB INDENT SIZE = 2
) result
from vozidlo a
join model b on a.typ_karoserie = b.typ_karoserie
    and a.nazov_modelu = b.nazov_modelu
    and a.id_vyrobcu = b.id_vyrobcu
join vyrobca c on b.id_vyrobcu = c.id_vyrobcu
join typ_karoserie d on d.id_typu = b.typ_karoserie
left join (
    select e.vyrobne_cislo, f.datum, f.akcia, f.kilometre
    from vozidlo e, table(e.zaznamy) f) g on g.vyrobne_cislo = a.vyrobne_cislo
where a.vyrobne_cislo = :P7_VIN_VOZIDLA
group by a.vyrobne_cislo, a.datum_vyroby, c.nazov, a.nazov_modelu, a.farba, a.kod_motora, a.kod_prevodovky, d.popis
fetch first row only;

INDENT SIZE = 2指定缩进为2个空格,可根据需求调整。

2. 选择合适的APEX显示元素

选项一:只读文本区域(Read Only Text Area)

  • 创建只读文本区域元素
  • 源类型选择「SQL查询」,输入上述修改后的SQL
  • 调整元素的高度(比如设置为20行),确保能完整显示XML内容
  • 此元素支持多行显示,且能保留缩进格式,不会出现Textarea的类型匹配错误

选项二:代码编辑器(Code Editor)

  • 若使用APEX 19.2及以上版本,推荐使用代码编辑器元素
  • 设置「语言」为XML,自动提供语法高亮
  • 源类型选择「SQL查询」,输入修改后的SQL
  • 体验更专业,适合查看结构化XML内容

选项三:优化动态内容元素

  • 若坚持使用动态内容,需在SQL中返回带<pre>标签的内容,让浏览器保留格式:
select '<pre>' || XMLSERIALIZE(
    DOCUMENT xmlroot(
        xmlelement("vozidlo",
            xmlattributes(
                a.vyrobne_cislo as "vin",
                a.datum_vyroby as "dat_vyroby"
            ),
            xmlforest(
                c.nazov as "vyrobca",
                a.nazov_modelu as "model",
                a.farba as "farba",
                rtrim(a.kod_motora) as "kod_motor",
                rtrim(a.kod_prevodovky) as "kod_prevodovka",
                d.popis as "typ_karoserie",
                xmlagg(
                    xmlelement("zaznam",
                        xmlattributes (
                            g.datum as "datum"
                        ),
                        xmlforest(
                            g.akcia as "popis",
                            g.kilometre as "kilometre"
                        )
                    ) order by g.kilometre
                ) as "zaznamy"
            )
        )
    , version '1.0')
    AS CLOB INDENT SIZE = 2
) || '</pre>' result
from vozidlo a
join model b on a.typ_karoserie = b.typ_karoserie
    and a.nazov_modelu = b.nazov_modelu
    and a.id_vyrobcu = b.id_vyrobcu
join vyrobca c on b.id_vyrobcu = c.id_vyrobcu
join typ_karoserie d on d.id_typu = b.typ_karoserie
left join (
    select e.vyrobne_cislo, f.datum, f.akcia, f.kilometre
    from vozidlo e, table(e.zaznamy) f) g on g.vyrobne_cislo = a.vyrobne_cislo
where a.vyrobne_cislo = :P7_VIN_VOZIDLA
group by a.vyrobne_cislo, a.datum_vyroby, c.nazov, a.nazov_modelu, a.farba, a.kod_motora, a.kod_prevodovky, d.popis
fetch first row only;
  • 创建动态内容元素,源类型选「SQL查询」,输入上述SQL即可显示带缩进的XML

内容的提问来源于stack exchange,提问作者Filip Zaťko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:55:59