如果您要将其转换为 sql 语句并运行它,如下所示:
WITH sample_data AS (SELECT XMLTYPE('<?xml version="1.0" ?>
<StatusUp>
<G_UUIDs>
<UUID>1 test 1</UUID>
<UUID>2 test 2</UUID>
<UUID>3 test 3 </UUID>
<UUID>4 test 4 </UUID>
</G_UUIDs>
</StatusUp>') x FROM dual)
SELECT p.*,
EXTRACTVALUE(VALUE(p), 'StatusUp/G_UUIDs/UUID/text()') AS uuid
FROM sample_data sd,
TABLE(XMLSEQUENCE(EXTRACT(sd.x, '//StatusUp/G_UUIDs/UUID'))) p;
很容易发现问题:
COLUMN_VALUE UUID
------------------------ ----------
<UUID>1 test 1</UUID>
<UUID>2 test 2</UUID>
<UUID>3 test 3 </UUID>
<UUID>4 test 4 </UUID>
即您正在尝试从仅包含节点 UUID 的 xml 中提取节点 StatusUp/G_UUIDs/UUID。相反,如果您更正要查询的节点,您会得到正确的结果:
DECLARE
X XMLTYPE := XMLTYPE('<?xml version="1.0" ?>
<StatusUp>
<G_UUIDs>
<UUID>1 test 1</UUID>
<UUID>2 test 2</UUID>
<UUID>3 test 3 </UUID>
<UUID>4 test 4 </UUID>
</G_UUIDs>
</StatusUp>');
BEGIN
FOR r IN (SELECT EXTRACTVALUE(VALUE(p), 'UUID/text()') AS uuid
FROM TABLE(XMLSEQUENCE(EXTRACT(X, '//StatusUp/G_UUIDs/UUID'))) p)
LOOP
DBMS_OUTPUT.PUT_LINE('UUID' || r.uuid);
END LOOP;
END;
/
UUID1 test 1
UUID2 test 2
UUID3 test 3
UUID4 test 4
但是,不推荐使用 EXTRACT 和 EXTRACTVALUE - 您应该改用 XMLTABLE:
DECLARE
X XMLTYPE := XMLTYPE('<?xml version="1.0" ?>
<StatusUp>
<G_UUIDs>
<UUID>1 test 1</UUID>
<UUID>2 test 2</UUID>
<UUID>3 test 3 </UUID>
<UUID>4 test 4 </UUID>
</G_UUIDs>
</StatusUp>');
BEGIN
FOR r IN (SELECT *
FROM XMLTABLE('//StatusUp/G_UUIDs/UUID'
PASSING x
COLUMNS uuid varchar2(10) PATH '.'))
LOOP
DBMS_OUTPUT.PUT_LINE('UUID' || r.uuid);
END LOOP;
END;
/
UUID1 test 1
UUID2 test 2
UUID3 test 3
UUID4 test 4
您应该尝试运行的等效查询:
WITH sample_data AS (SELECT XMLTYPE('<?xml version="1.0" ?>
<StatusUp>
<G_UUIDs>
<UUID>1 test 1</UUID>
<UUID>2 test 2</UUID>
<UUID>3 test 3 </UUID>
<UUID>4 test 4 </UUID>
</G_UUIDs>
</StatusUp>') x FROM dual)
SELECT *
FROM sample_data sd,
XMLTABLE('//StatusUp/G_UUIDs/UUID'
PASSING sd.x
COLUMNS uuid varchar2(10) PATH '.');