如何将单个 xmltype 标记中的值提取到 oracle 中的不同列中?

How to extract values from a single xmltype tag into different columns in oracle?

我在 table 中有一个 xmltype 列,其中包含以下标记

<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL">
      <X>-2.12105834</X>
      <Y>49.20372223</Y>
    </LOCATION>

我使用以下查询提取了列中类型的值

SELECT a.object_id,a.xml_data.extract('//LOCATION/@TYPE').getStringVal() AS "Location Type"
FROM   object_history a;

table 中单列的输出是 ABSABSREL。 我想在 table 的单独列中获取每个值。 请帮助如何做到这一点?

使用XMLTABLE:

SELECT object_id,
       x.*
FROM   object_history h
       CROSS APPLY XMLTABLE(
         '/LOCATION'
         PASSING h.xml_data
         COLUMNS
           type VARCHAR2(3)  PATH './@TYPE',
           epsg NUMBER       PATH './@EPSG',
           unit VARCHAR2(10) PATH './@UNIT',
           x    NUMBER       PATH './X',
           y    NUMBER       PATH './Y'
       ) x

其中,对于示例数据:

CREATE TABLE object_history ( object_id, xml_data ) AS
SELECT 1, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-2</X><Y>49</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 2, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-1</X><Y>50</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 3, XMLTYPE('<LOCATION TYPE="REL" EPSG="4277" UNIT="decLL"><X>0</X><Y>51</Y></LOCATION>') FROM DUAL;

输出:

OBJECT_ID TYPE EPSG UNIT X Y
1 ABS 4277 decLL -2 49
2 ABS 4277 decLL -1 50
3 REL 4277 decLL 0 51

db<>fiddle here