[問題] 使用JSQLParser,要將抓出來的where子句

作者: lueichun (no anonymous)   2022-02-18 18:32:03
※狀況概述:
我現在要利用JSQLParser這個套件,將SQL語句的內容解析出來,例如將SELECT句子內的
Where子句抓出來,然後作其他處理。現在是可以抓出where子句出來,不過當我要用
變數去接該where子句時,例如這樣:
String left = "";
left = expr.getLeftExpression().toString();//=右邊是抓出來的where子句
就會跳出:
Local variable left defined in an enclosing scope must be final or effectively
final jsqlparser
看起來是不能直接用一個單純的變數去接,我google的結果,看起來是跟
內部類別跟local variable的互動有關係,不過我找到的都是lambda或是多執行緒的範例,
而且就算是把left這個變數設成final,也還是會跳出final變數不能被assgin值的錯誤
程式碼附在下面,請問為什麼要這樣設定?然後該怎麼改才好呢?
※程式碼:
public static void test(String sql) throws JSQLParserException {
String whereClause = "";
String left = "";
if (CCJSqlParserUtil.parse(sql) instanceof Select) {
//取出一般查詢的where子句
Select select = (Select)CCJSqlParserUtil.parse(sql);
System.out.println(select.getSelectBody());
PlainSelect pl = (PlainSelect)select.getSelectBody();
if(pl.getWhere()!=null){
whereClause = pl.getWhere().toString();
}
//這裡有抓到where子句
System.out.println("whereClause=" + whereClause);
}
if(whereClause != null && !whereClause.equals("")) {
//有抓到where子句,所以會進來if區塊內
Expression expr =
CCJSqlParserUtil.parseCondExpression(whereClause);
expr.accept(new ExpressionVisitorAdapter() {
@Override
protected void visitBinaryExpresion(BinaryExpression expr){
if (expr instanceof ComparisonOperator) {
//這裡有印出抓到的WHERE子句,結果正常
System.out.println(
"left=" + expr.getLeftExpression() +
" op=" + expr.getStringExpression() +
" right=" + expr.getRightExpression());
left = expr.getLeftExpression().toString();//在這行出錯
//跳出Local variable left defined in an enclosing scope
//must be final or effecti final jsqlparser
}//end if
super.visitBinaryExpression(expr);
}//end protected void......
});//end if
}//end if
}//end整個method
※錯誤訊息:
※補充說明:
作者: icydream (巧虎)   2022-02-19 09:04:00
把left宣告成字串陣列, 後面的操作改成left[0]

Links booklink

Contact Us: admin [ a t ] ucptt.com