如何在 Oracle 中解析 XML

How to parse XML in Oracle

我有以下 SQL 服务器查询,我必须将其转换为 Oracle:

Select PhotoNumber, cast(cast(cast( PhotoInfo as varbinary(max)) as varchar(max)) as XML).value('(/DataIM/PhotoChosen/Photo/jpg)[1]', 'varchar(max)') as PhotoInfo 
From ProfilePictures 
Where photosourcetype = 10

我把它转换成Oracle如下

Select PhotoNumber, extract(xmltype(photoinfo,1), '(/DataIM/PhotoChosen/Photo/jpg)[1]') "photoinfo"
    From ProfilePictures 
    Where photosourcetype = 10

/DataIM/PhotoChosen/Photo/jpg)[1]

中出现无效标记错误

如何解析我的 XML?我只想要字符串中的详细信息。

您所展示的带有平衡括号的内容有效:

Select PhotoNumber, extract(xmltype(photoinfo,1), '(/DataIM/PhotoChosen/Photo/jpg)[1]') "photoinfo"
    From ProfilePictures 
    Where photosourcetype = 10
PHOTONUMBER | photoinfo              
----------- | -----------------------
         42 | <jpg>my_photo.jpg</jpg>

尽管我不确定括号的作用,但没有括号也能正常工作。您可能只需要实际的字符串,而不是 jpg 节点及其内容;因此您可以将 /text() 添加到 XPath 中以获取它。

extract 已弃用,因此最好使用 XML 查询:

Select PhotoNumber,
        XMLQuery(
            '/DataIM/PhotoChosen/Photo/jpg[1]/text()'
            passing xmltype(photoinfo, 1)
            returning content
        ).getstringval() "photoinfo"
    From ProfilePictures 
    Where photosourcetype = 10
PHOTONUMBER | photoinfo   
----------- | ------------
         42 | my_photo.jpg

db<>fiddle

我保留了你的 quoted identifier,但我建议你避免使用这些,除非真的有必要。

您正在使用字符集标识符 1 将 BLOB 转换为 XML。希望这是正确的,也是您想要的。你可以看到实际上是哪个字符集:

select nls_charset_name(1) from dual;

在我的系统上报告为 US7ASCII,我怀疑到处都是旧的默认值。

传递 0 改为使用数据库字符集。不过,您需要知道 BLOB 数据使用的字符集。如果您知道可以查找要使用的正确号码,例如:

select nls_charset_id('UTF8') from dual;

或者直接在xmltype()调用中传入:

...
            passing xmltype(photoinfo, nls_charset_id('UTF8'))
...