Oracle—在XMLType中从XMLprolog中提取XML版本并进行编码



假设我们在Oracle中有以下XMLType:

<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>

我需要获得XML版本和编码值或整个XML prolog,最好使用XML函数,例如XMLTABLE。这可能吗?或者只使用string/CLB函数?

我们使用Oracle 19c。

这可能吗?

不,不幸的是,它不是,因为像XMLTable这样的XML函数与XMLType一起工作,XMLType解析输入的XML(如果是CLOB或Varchar2,则从NLS_LANG字符集,如果是BLOB,则从指定的字符集(,并将其存储在自己的内部代码页中,当您获得它时,oracle会在NLS_LANG:中返回它

SQL> with v as (select q'[<?xml version="1.1" encoding="blabla"?><root/>]' as vXML from dual)
2  select xmltype(vXML) x from v;
X
------------------------------------------------
<?xml version="1.1" encoding="US-ASCII"?>
<root/>

看看如果我把NLS_LANG改成UTF8:会怎么样

SQL> with v as (select q'[<?xml version="1.1" encoding="blabla"?><root/>]' as vXML from dual)
2  select xmltype(vXML) x from v;
X
-----------------------------------------
<?xml version="1.1" encoding="UTF-8"?>
<root/>

SQL> ! env | grep NLS_LANG
NLS_LANG=american_america.UTF8

最新更新