2

JSQLParser 可以区分 SELECT 查询中的 View/Function/Table 吗?

例如,如果以以下方式执行函数: select * from public.new(10); 选择 public.new(10);

JSQL 是否有可能找出它正在执行一个函数并返回该信息?

4

1 回答 1

0

答案是:视情况而定

JSqlParser 只是一个解析器,没有关于数据库模式的信息。在某些数据库中,允许在没有括号的情况下调用无参数函数,例如select NOW(希望这确实是一个函数;))。在这种情况下, NOW将被接受为列名。

但是 JSqlParser 支持参数化函数,例如select testfunc(param1). 在这种情况下,它将被接受为一个函数

从语法上讲,视图的用法是相同的,而JSqlParser不能在它们之间有所不同。视图名称将被接受为表名称。

要区分:

  1. 首先你会让JSqlParser解析你的语句
  2. 提取所有列名、表名、函数名(这里的一个好的开始是JSqlParser的TableNameFinder实用程序)
  3. 得到你需要用你的数据库模式检查它的最终类型

所以这里是第 1 点和第 2 点的一个小例子:

Statement statement = CCJSqlParserUtil.parse("select myfunc(5), now from public.new(10), mytable");

TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
    @Override
    public void visit(Column tableColumn) {
        System.out.println("column = " + tableColumn);
    }

    @Override
    public void visit(Function function) {
        System.out.println("function = " + function.getName());
        super.visit(function); 
    }

    @Override
    public void visit(Table tableName) {
        System.out.println("table = " + tableName.getFullyQualifiedName());
        super.visit(tableName); 
    }

    @Override
    public void visit(TableFunction valuesList) {
        System.out.println("table function = " + valuesList.getFunction().getName());
        super.visit(valuesList); 
    }
};

System.out.println("all extracted tables=" + tablesNamesFinder.getTableList(statement));

结果是:

function = myfunc
column = now
table function = public.new
table = mytable
all extracted tables=[mytable]
于 2018-04-27T07:14:30.030 回答