我使用的第三方产品处理外部XML文件时遇到问题。它会导致数据库崩溃,因为无法正确解析与号(它们没有转义)。
如果我要通过SQLPlus做到这一点,我只需使用"SET DEFINE OFF"或"SET ESCAPE ON"或两者都使用!
但是,此过程会从包中调用一个函数。
包装主体的一部分如下:
CURSOR extractxml_c
IS
SELECT TRIM( extractvalue(column_value, '/TARLROW/HUSID')) husid,
TRIM( extractvalue(column_value, '/TARLROW/UKPRN')) ukprn,
TRIM( extractvalue(column_value, '/TARLROW/NUMHUS')) numhus,
TRIM( extractvalue(column_value, '/TARLROW/CAMPID')) campid,
TRIM( extractvalue(column_value, '/TARLROW/NAMECAT')) namecat,
TRIM( extractvalue(column_value, '/TARLROW/COURSEAIM')) courseaim,
TRIM( extractvalue(column_value, '/TARLROW/CTITLE')) ctitle,
TRIM( extractvalue(column_value, '/TARLROW/OWNSTU')) ownstu,
TRIM( extractvalue(column_value, '/TARLROW/STATUS') ) status,
TRIM( extractvalue(column_value, '/TARLROW/YEAR')) year,
TRIM( extractvalue(column_value, '/TARLROW/QUALENT2')) qualent2,
TRIM( extractvalue(column_value, '/TARLROW/COMDATE')) comdate,
TRIM( extractvalue(column_value, '/TARLROW/POSTCODE')) postcode,
TRIM( extractvalue(column_value, '/TARLROW/ETHNIC')) ethnic,
TRIM( extractvalue(column_value, '/TARLROW/DOMICILE')) domicile,
TRIM( extractvalue(column_value, '/TARLROW/YRLLINST') ) yrllinst,
TRIM( extractvalue(column_value, '/TARLROW/UCASAPPID')) ucasappid,
TRIM( extractvalue(column_value, '/TARLROW/OWNINST')) owninst,
TRIM( extractvalue(column_value, '/TARLROW/TTCID') ) ttcid,
TRIM( extractvalue(column_value, '/TARLROW/QUALENT3')) qualent3,
NULL pidm,
p_cohort chrt_code,
p_term_code term_code,
USER user_id,
SYSDATE activity_date,
'Banner: ESC_HST_CHRT_HINTAR_XML' data_origin,
NULL surrogate_id,
NULL version,
NULL vpdi_code,
gkkpsql.API_RetrieveRunSequence run_seq
FROM TABLE(XMLSequence( l_xmltype.extract('/TARLREPORT/TARLROWS/TARLROW'))) ;
我想使用上面代码中CTITLE部分的replace函数来替换从XML文件中提取的与号字符。
类似这样的东西:
SELECT REPLACE('&' , '|| chr(38) || ')
然而,我似乎无法正确理解语法。在编译程序包时,我不断出现右括号缺失的错误。
我使用过:
TRIM( extractvalue(column_value, (REPLACE('&' , '|| chr(38) || ') '/TARLROW/CTITLE')) ctitle,
和
REPLACE('&' , '|| chr(38) || ') TRIM( extractvalue(column_value, '/TARLROW/CTITLE')) ctitle,
两者都不起作用。
有什么想法可以替换从TRIM(extractvalue)字符串函数中提取的字符吗?
TIA
REPLACE
接受三个参数;可选的第三个是替换字符串。第一个是要变换的原始字符串。所以我想你想要:
REPLACE(TRIM(extractvalue(column_value, '/TARLROW/CTITLE')),
'&', chr(38)) ctitle
据我所知,您不需要串联字符(||
),除非您稍后要对此执行其他操作。REPLACE和TRIM可以按任意顺序进行,但其中一个需要在另一个内部。
但不知道你说的导致数据库兑现是什么意思。这只是一根绳子。只有在SQL*Plus命令中使用"与"符号时,它才会被视为替换变量。你的最后一个字符串最终仍然会有一个"与"符号。听起来你试图解决错误的问题。