ORA-19112: 使用 XMLTABLE 将逗号分隔的字符串转换为行时在求值期间出现错误
ORA-19112: error raised during evaluation while converting comma separated strings to rows using XMLTABLE
我正在尝试使用 Oracle 中的 XMLTABLE 函数将逗号分隔的字符串拆分为行。
例如
WITH MYTABLE AS
(SELECT '"AB","PQ","XY"' TEXT FROM DUAL
)
SELECT REPLACE((column_value).GETSTRINGVAL(),'"','') "OPTION_TEXT"
FROM MYTABLE,
XMLTABLE(TEXT);
以上查询工作正常。但是当传递带有 & 的字符串时,它会抛出异常 as
java.sql.SQLException: ORA-19112: 计算期间出现错误:
WITH MYTABLE AS
(SELECT '"AB","P & Q","XY"' TEXT FROM DUAL
)
SELECT REPLACE((column_value).GETSTRINGVAL(),'"','') "OPTION_TEXT"
FROM MYTABLE,
XMLTABLE(TEXT);
请注意,此查询是从 java 通过准备好的语句执行的。
我想问题出在 XML 里面的 special characters。
快速(可能很脏)解决方法是使用 REPLACE
替换特殊字符:
WITH MYTABLE AS
(SELECT '"AB","P & Q","XY"' TEXT FROM DUAL
)
SELECT REPLACE(extractValue(column_value,'/text()'),'"','') "OPTION_TEXT"
FROM MYTABLE,
XMLTABLE(REPLACE(REPLACE(REPLACE(TEXT, '&', '&'), '<', '<'), '>', '>'));
问题出在 XQuery 表达式的计算上。
您可以 split the comma delimited string into rows 使用 REGEXP_SUBSTR。
看看这个SQL Fiddle
工作演示:
SQL> WITH mytable AS
2 (SELECT '"AB","P & Q","XY"' TEXT FROM DUAL
3 )
4 SELECT trim(regexp_substr(TEXT, '[^,]+', 1, LEVEL)) TEXT
5 FROM mytable
6 CONNECT BY LEVEL <= regexp_count(TEXT, ',')+1;
TEXT
-----------------
"AB"
"P & Q"
"XY"
我正在尝试使用 Oracle 中的 XMLTABLE 函数将逗号分隔的字符串拆分为行。 例如
WITH MYTABLE AS
(SELECT '"AB","PQ","XY"' TEXT FROM DUAL
)
SELECT REPLACE((column_value).GETSTRINGVAL(),'"','') "OPTION_TEXT"
FROM MYTABLE,
XMLTABLE(TEXT);
以上查询工作正常。但是当传递带有 & 的字符串时,它会抛出异常 as
java.sql.SQLException: ORA-19112: 计算期间出现错误:
WITH MYTABLE AS
(SELECT '"AB","P & Q","XY"' TEXT FROM DUAL
)
SELECT REPLACE((column_value).GETSTRINGVAL(),'"','') "OPTION_TEXT"
FROM MYTABLE,
XMLTABLE(TEXT);
请注意,此查询是从 java 通过准备好的语句执行的。
我想问题出在 XML 里面的 special characters。
快速(可能很脏)解决方法是使用 REPLACE
替换特殊字符:
WITH MYTABLE AS
(SELECT '"AB","P & Q","XY"' TEXT FROM DUAL
)
SELECT REPLACE(extractValue(column_value,'/text()'),'"','') "OPTION_TEXT"
FROM MYTABLE,
XMLTABLE(REPLACE(REPLACE(REPLACE(TEXT, '&', '&'), '<', '<'), '>', '>'));
问题出在 XQuery 表达式的计算上。
您可以 split the comma delimited string into rows 使用 REGEXP_SUBSTR。
看看这个SQL Fiddle
工作演示:
SQL> WITH mytable AS
2 (SELECT '"AB","P & Q","XY"' TEXT FROM DUAL
3 )
4 SELECT trim(regexp_substr(TEXT, '[^,]+', 1, LEVEL)) TEXT
5 FROM mytable
6 CONNECT BY LEVEL <= regexp_count(TEXT, ',')+1;
TEXT
-----------------
"AB"
"P & Q"
"XY"