1

xpathルールをコピーして、ソナー(plsql)にカスタムルールを書き込もうとしています。このルールのタスクは、savepoint ステートメントが欠落している 'rollback to savepoint' ステートメントをマークすることです。

2 つのセーブポイントと 3 つのロールバック ステートメントの場合、AST (抽象構文ツリー) は次のようになります。

<PROCEDURE_DEFINITION>
  ...
  <SAVEPOINT>
    <IDENTIFIER tokenValue="SAVEPOINT" />
    <IDENTIFIER tokenValue="spA" />
    <SEMICOLON tokenValue=";" />
  </SAVEPOINT>
  ...
  <SAVEPOINT>
    <IDENTIFIER tokenValue="SAVEPOINT" />
    <IDENTIFIER tokenValue="spB" />
    <SEMICOLON tokenValue=";" />
  </SAVEPOINT>
  ...
  <ROLLBACK>
    <IDENTIFIER tokenValue="ROLLBACK" />
    <TO />
    <IDENTIFIER tokenValue="SAVEPOINT" />
    <IDENTIFIER tokenValue="spB" />
    <SEMICOLON tokenValue=";" />
  </ROLLBACK>
  ...
  <ROLLBACK>
    <IDENTIFIER tokenValue="ROLLBACK" />
    <TO />
    <IDENTIFIER tokenValue="SAVEPOINT" />
    <IDENTIFIER tokenValue="spA" />
    <SEMICOLON tokenValue=";" />
  </ROLLBACK>
  ...
  <ROLLBACK>
    <IDENTIFIER tokenValue="ROLLBACK" />
    <TO />
    <IDENTIFIER tokenValue="SAVEPOINT" />
    <IDENTIFIER tokenValue="spX" />
    <SEMICOLON tokenValue=";" />
  </ROLLBACK>
  ...
</PROCEDURE_DEFINITION> 

セーブポイント spX がないため、最後のロールバックをマークする XPath クエリを検索します。しかし、この xpath は最後の両方のロールバックをマークします

//PROCEDURE_DEFINITION//ROLLBACK[
    IDENTIFIER[
        @tokenValue =
            ./ancestor::PROCEDURE_DEFINITION
                //SAVEPOINT/IDENTIFIER[2]/@tokenValue
    ]
]

助言がありますか?

編集:
私はこの次善の解決策を見つけました:

//PROCEDURE_DEFINITION//ROLLBACK
[
  not(
    ./IDENTIFIER[3]/@tokenValue = 
    ancestor::PROCEDURE_DEFINITION//SAVEPOINT/IDENTIFIER[2]/@tokenValue
  )
]

PLSQL は大文字と小文字を区別しません。しかし、翻訳機能を追加すると、最初と最後の ROLLBACK ノードがマークされます。すべてのロールバックの名前は、最初のセーブポイントの名前と一致すると思いますか?

4

1 に答える 1