2017-06-19 96 views
0

在下面的代码中,首先需要添加一个元素,在代码的其余部分创建或更新一个名为t的属性。一次执行多个修改操作

declare 
    LOG_REFERENCE xmltype:=xmltype('<log />'); 
begin 

    select XMLQuery(' 
    copy $p := $p1 modify insert node <update data="{$p2}" /> 
       as last into $p/log 
    return $p 
    ' PASSING LOG_REFERENCE AS "p1", to_char(systimestamp) AS "p2" RETURNING CONTENT) 
     INTO LOG_REFERENCE from dual; 

    select XMLQuery(' 
    copy $i := $p1 modify(
     if (fn:exists($i/log[1]/@t)) then (
     replace value of node $i/log[1]/@t with $p2 
    ) else (
     insert node attribute t {$p2} into $i/log[1] 
    ) 
    ) 
    return $i 
    ' PASSING LOG_REFERENCE AS "p1", to_char(systimestamp) AS "p2" RETURNING CONTENT) 
     INTO LOG_REFERENCE from dual; 

    dbms_output.PUT_LINE(LOG_REFERENCE.getClobVal()); 
end; 

我的问题是,我想参加这两项修改成一个XQuery的呼叫这样

declare 
    LOG_REFERENCE xmltype:=xmltype('<log />'); 
begin 

    select XMLQuery(' 
    copy $p := $p1 modify(
    insert node <update data="{$p2}" /> 
       as last into $p/log 
    ) 

    copy $i := $p modify(
     if (fn:exists($i/log[1]/@t)) then (
     replace value of node $i/log[1]/@t with $p2 
    ) else (
     insert node attribute t {$p2} into $i/log[1] 
    ) 
    ) 

    return $i 
    ' PASSING LOG_REFERENCE AS "p1", to_char(systimestamp) AS "p2" RETURNING CONTENT) 
     INTO LOG_REFERENCE from dual; 

    dbms_output.PUT_LINE(LOG_REFERENCE.getClobVal()); 
end; 

在我的头上,这是正确的,但很明显,我在想念的东西。或者它不能在oracle xquery中完成?

其被赋予了错误消息:

ORA-19114: - : LPX-00801:XPST0003解析所述XQuery表达式时的错误的XQuery语法错误在 '复制' 7拷贝$ I:= $ P修改( -^ORA-06512:EM线5

回答

1

您可以在一个修改条款中既包括操作:

declare 
    LOG_REFERENCE xmltype:=xmltype('<log />'); 
begin 

    select XMLQuery(' 
    copy $p := $p1 modify(
    insert node <update data="{$p2}" /> 
       as last into $p/log, 
     if (fn:exists($p/log[1]/@t)) then (
     replace value of node $p/log[1]/@t with $p2 
    ) else (
     insert node attribute t {$p2} into $p/log[1] 
    ) 
    ) 

    return $p 
    ' PASSING LOG_REFERENCE AS "p1", to_char(systimestamp) AS "p2" RETURNING CONTENT) 
     INTO LOG_REFERENCE from dual; 

    dbms_output.PUT_LINE(LOG_REFERENCE.getClobVal()); 
end; 
/

<log t="19-JUN-17 21.25.56.434586 +01:00"><update data="19-JUN-17 21.25.56.434586 +01:00"/></log> 

PL/SQL procedure successfully completed. 

这似乎与您的原始块获得相同的结果,有或没有现有的t属性。顺便提一下,您目前正在依靠您的NLS会话设置将时间戳格式化为字符串;明确地做它会更好,例如

... 
    ' PASSING LOG_REFERENCE AS "p1", 
     to_char(systimestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF6') AS "p2" 
     RETURNING CONTENT) 
     INTO LOG_REFERENCE from dual; 

得到像

<log t="2017-06-19T21:28:54.896506"><update data="2017-06-19T21:28:54.896506"/></log> 
输出
相关问题