2017-06-19 93 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> 
輸出
相關問題