如何使用Oracle中的触发器更新XML节点(XMLELEMENT)

时间:2018-09-28 14:05:44

标签: oracle triggers

我刚刚开始在oracle中编写触发器。而且此触发器需要使用Orecle中的xmlements将节点修改为xml

这是触发器:

CREATE OR REPLACE TRIGGER trg_news_name
    after insert on SelectiveProcess
for each ROW
declare
  v_new_name  VARCHAR2(400);
  v_data         xmltype;
BEGIN
       v_data := :new.dataNode;
       SELECT  to_char(ExtractValue(v_data ,'/DATAS/NEWS_NAME'))
              INTO
              v_new_name  
       FROM DUAL;

       v_new_name  := :new.codigo || ' - ' || v_new_name ;

       [.........]

end;

现在,我需要使用变量 v_new_name 更新节点 NEWS_NAME

我知道我可以使用一个简单的查询来更新节点,例如:

UPDATE SelectiveProcess SET dataNode =
   UPDATEXML(dataNode,
   '/DATAS/NEWS_NAME','TESTE NAME')
   WHERE ID = 3;

但是如何在触发器中做到这一点?

1 个答案:

答案 0 :(得分:1)

AFTER INSERT触发器不允许您更新:NEW值。 因此,基本上将其转换为BEFORE INSERT并像在更新语句中那样覆盖:NEW值。

 select   UPDATEXML(dataNode,
       '/DATAS/NEWS_NAME', v_new_name ) INTO :new.dataNode  FROM DUAL;

或者将它们放在一起。

 SELECT  UPDATEXML(dataNode,
       '/DATAS/NEWS_NAME', :new.codigo || ' - ' 
     to_char(ExtractValue(:new.dataNode ,'/DATAS/NEWS_NAME') ) ) INTO  :new.dataNode FROM DUAL;