使用REPLACE字符串函数和TRIM(Oracle / PLSQL)

时间:2014-04-25 14:34:06

标签: sql oracle replace plsql trim

我使用的第三方产品存在问题,处理外部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

1 个答案:

答案 0 :(得分:1)

REPLACE takes three arguments;可选的第三个是替换字符串。第一个是您要转换的原始字符串。所以我想你想要:

REPLACE(TRIM(extractvalue(column_value, '/TARLROW/CTITLE')),
  '&', chr(38)) ctitle

根据我的判断,你不需要连接字符(||),除非你以后再做其他事情。 REPLACE和TRIM可以按任意顺序排列,但一个需要在另一个内部。

不确定你的意思,导致数据库兑现。这只是一个字符串。如果您在SQL * Plus命令中使用&符号,则仅将其视为替换变量。而你的最终字符串仍将以一个&符号结尾。听起来你正试图解决错误的问题。