我使用的第三方产品存在问题,处理外部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部分的替换功能替换从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
答案 0 :(得分:1)
REPLACE
takes three arguments;可选的第三个是替换字符串。第一个是您要转换的原始字符串。所以我想你想要:
REPLACE(TRIM(extractvalue(column_value, '/TARLROW/CTITLE')),
'&', chr(38)) ctitle
根据我的判断,你不需要连接字符(||
),除非你以后再做其他事情。 REPLACE和TRIM可以按任意顺序排列,但一个需要在另一个内部。
不确定你的意思,导致数据库兑现。这只是一个字符串。如果您在SQL * Plus命令中使用&符号,则仅将其视为替换变量。而你的最终字符串仍将以一个&符号结尾。听起来你正试图解决错误的问题。