Oracle - 从 XML 序言中提取 XML 版本和编码 XMLType

Oracle - extracting XML version and encoding from XML prolog in XMLType

假设我们有以下 XML在 Oracle 中键入:

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

我需要获取 XML 版本和编码值或整个 XML 序言,最好使用 XML 函数,f。前任。 XML表格。那可能吗?或者只有 string/CLOB 函数?

我们使用 Oracle 19c。

Is that possible?

不,不幸的是,它不是,因为 XML 功能类似于 XMLTable 使用 XMLType 解析您的输入 xml(来自您的 NLS_LANG 字符集,如果它是 CLOB 或 Varchar2,如果它是 BLOB,则来自指定的字符集)并将它存储在自己的内部代码页中,当你得到它时,oracle returns 它在你的 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