3

( insert/ delete)-XQuery を BaseX クライアントで実行すると、常に空の文字列が返されることがわかりました。これは非常に紛らわしいか、直感的ではないと思います。

データベースに再度クエリを実行せずに、クエリが「成功」したかどうかを確認する方法はありますか (また、「ノードを削除した場合、XML に 'oldNodeCount-1' ノードが存在する必要がある」などの潜在的にバグのある「推移的」ロジックを使用します)。 ?

4

1 に答える 1

3

XQuery Update ステートメントは何も返しません。そのように定義されています。しかし、これらの制限が気に入らないのはあなただけではなく、BaseX はこの制限を回避する 2 つの方法を追加しました

結果を返す

デフォルトでは、クエリ結果に異なるタイプの式を混在させることはできません。クエリの最も外側の式は、更新式または非更新式のコレクションである必要があります。しかし、2 つの方法があります。

  • BaseX 固有のupdate:output()関数は、このギャップを埋めます。実行時に引数の結果をキャッシュし、すべての更新が処理された後にそれらを返します。次の例では、更新を実行し、成功メッセージを返します。

    update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
    
  • このMIXUPDATESオプションを使用すると、すべての更新制約がオフになります。返されたノードは、式の更新によって変更される前にコピーされます。変換式内でアイテムが返されると、エラーが発生します。

transform メイン メモリ内のノードを変更する場合は、式を使用できます。

ディスク上のデータを変更しているように見えるため、変換式は役に立ちません。有効MIXUPDATESにすると、ドキュメントを更新すると同時に何かを返すことができます。たとえば、次のようなものを実行します。

let $node := <c/>
return ($node, insert node $node into doc('factbook')/mondial)

MIXUPDATESさらに処理できるものを返すことができます。結果は返される前にコピーされます。複数の更新操作を実行して期待した結果が得られない場合は、保留中の更新リストの概念を理解していることを確認してください。

このdb:output()関数は意図的にインターフェイスの契約を破っています。更新関数として定義されていますが (出力はありません)、同時にいくつかの情報をクエリ情報に出力しています。これらの結果をさらに処理することはできませんが、出力はいくつかの問題のデバッグに役立ちます。

保留中の更新リスト

どちらの方法でも、更新からすぐに結果を得ることができ、自分で何かを追加する必要があります。また、保留中の更新リストが適用されるまで更新が表示されないことに注意してください。クエリが終了した後。

互換性

明らかに、これらのオプションは BaseX 固有です。互換性のある標準 XQuery が強く必要な場合は、これらの式を使用できません。

于 2016-05-01T07:52:55.270 に答える