我嘗試通過複製xpath規則在聲納(plsql)中編寫自定義規則。這條規則的任務是在保存點語句丟失的地方標記「回退到保存點」語句。XPath-1.0:標記相對節點丟失的節點
對於2保存點和3條ROLLBACK語句的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>
我要尋找的XPath查詢,因爲保存點SPX缺少這標誌着最後回滾。 但是這個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節點。我認爲所有回滾的名稱都會與第一個保存點的名稱一致?
謝謝Dinesh。你猜猜PL/SQL代碼是否正確(程序是程序包的一部分)。無論如何,你的XPath查詢手段很好。但是它並沒有在這個「保存點SpA;回滾spA;」上運行,因爲與XPath相比,PL/SQL是大案例。 – MintiSE
你是對的@MintiSE,雖然這是可以在純XPath 1.0中解決的,但我們在SSLR上有一張票,以使它更容易:[SSLR-310](http://jira.sonarsource.com/browse/SSLR-310 ) –
此外,這個規則將被包含在下一個PL/SQL插件版本中,因爲它對每個人都是有價值的(不僅僅是你):[PLSQL-443](http://jira.sonarsource.com/browse/) PLSQL-443) –