问题描述
我正在尝试从 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