【问题标题】:Using REPLACE string function with TRIM (Oracle/PLSQL)将 REPLACE 字符串函数与 TRIM (Oracle/PLSQL) 一起使用
【发布时间】:2014-06-11 08:12:35
【问题描述】:

我使用的处理外部 XML 文件的第 3 方产品存在问题。由于无法正确解析 & 符号(它们没有被转义),它会导致数据库崩溃。

如果我要通过 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

【问题讨论】:

    标签: sql oracle replace plsql trim


    【解决方案1】:

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

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

    据我所知,您不需要连接字符 (||),除非您稍后要对此进行其他操作。 REPLACE 和 TRIM 可以按任意顺序排列,但必须在另一个里面。

    不知道你的意思是什么导致数据库兑现。这只是一个字符串。只有当您在 SQL*Plus 命令中使用与号时,它才会被视为替换变量。你的最后一个字符串仍然会以一个&符号结束。听起来您正在尝试解决错误的问题。

    【讨论】:

    • 感谢 Alex 的正确语法。 XML 中的 & 符号实际上会导致 ORA-00060 死锁 - 用另一个符号(例如连字符)替换 XML 中的 & 符号可以解决问题。我想在提取阶段处理字符串,而不是在处理前或后处理它们。将尝试使用您的语法示例。
    • 我也是!在此之上构建了许多进程,但总体结果确实是一个死锁,除非原始 & 符号被剥离。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多