2017-06-19 3 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; 

私の問題は、私は2は、これは正しいですが、明らかに何かが欠けてイム私の頭の中でこの

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; 

のようなもののXQuery呼び出しに変更に参加したかったということです。それともoracle xqueryで実行できないのですか?

与えられたエラーメッセージ:

ORA-19114:XPST0003 - エラーをXQuery式解析中:= $ P:7コピー$ I 'コピー' でのXQuery構文エラー: LPX-00801を変更( -^ORA-06512:EMあなたは、単一のmodify節で両方の操作を組み合わせることができます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> 
のような出力を得るために
関連する問題