将REPLACE字符串函数与TRIM(Oracle/PLSQL)一起使用



我使用的第三方产品处理外部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命令中使用"与"符号时,它才会被视为替换变量。你的最后一个字符串最终仍然会有一个"与"符号。听起来你试图解决错误的问题。

最新更新