Oracle XMLTable 和 Create Table As Syntax Error

问题描述

我正在尝试从 XMLTable 类型 create table as 以将具有逗号分隔值的列拆分为多行,但收到​​有关语法不正确的错误

我的陈述看起来像

create table XX as (
select * from yy,xmltable(('"' || replace(csv_separated_list,','","') || '"'))
)

如果我运行 select 子查询,它会按预期工作......所以看起来它与 create table 作为语句包装它有关。

解决方法

从虚拟 XML 中提取的值不是字符串,尽管您的客户端可能会将其显示为一个字符串。 dump() 函数将其报告为类型 58,which is an opaque type。表列允许从该类型隐式转换为 XMLType 数据类型;这会引发 XML 处理错误,因为该值本身不是有效的 XML。

您可以将其转换为字符串类型:

create table XX as
select yy.*,cast(x.column_value as varchar2(30)) as value
from yy
cross join xmltable(('"' || replace(csv_separated_list,','","') || '"')) x

或者在xmltable中指定数据类型:

create table XX as
select yy.*,x.value
from yy
cross join xmltable(('"' || replace(csv_separated_list,"') || '"')
  columns value varchar2(30) path '.') x

db<>fiddle