如何使用plsql-parser(ANTLR)

时间:2014-02-07 21:23:42

标签: plsql antlr

我想在自动化测试中检查PL / SQL查询语法,看起来https://github.com/porcelli/plsql-parser可能对此有用。我不知道如何安装和使用它。

请注意,这是针对Ruby项目的,但我在Java方面相当称职。我希望有一些方法可以通过控制台运行检查,传入SQL,并获取任何错误信息,包括行/列。

感谢。

1 个答案:

答案 0 :(得分:3)

  • 下载ANTLR工具ver 3.5.1
  • here下载源代码(此版本移植到3.5.1)
  • 使用该工具从poarsers / no-ast subdir
  • 编译源代码
  • 第一次编译PLSQLLexer.g
  • 第二次从no-ast subdir
  • 编译PLSQLParser.g
  • 使用此示例代码作为示例:
    import org.antlr.runtime.ANTLRNoCaseFileStream;
    import org.antlr.runtime.CommonTokenStream;
    import org.antlr.runtime.RecognitionException;

    import br.com.porcelli.parser.plsql.PLSQLLexer;
    import br.com.porcelli.parser.plsql.PLSQLParser;

public static void parse(String file) {
    try {
        PLSQLLexer lex = new PLSQLLexer(new ANTLRNoCaseFileStream(file));
        CommonTokenStream tokens = new CommonTokenStream(lex);
        PLSQLParser parser = new PLSQLParser(tokens);

        /*start_rule_return AST =*/ parser.data_manipulation_language_statements();

        System.err.println(file +": " + parser.getNumberOfSyntaxErrors());

        if(parser.getNumberOfSyntaxErrors() != 0)
        {
            //System.exit(1);
        }

    } catch (RecognitionException e) {
        System.err.println(e.toString());
    } catch (IOException e) {
        System.err.println(e.toString());
    } catch (java.lang.OutOfMemoryError e) {
        System.err.println(file + ":");
        System.err.println(e.toString());
    } catch (java.lang.ArrayIndexOutOfBoundsException e) {
        System.err.println(file + ":");
        System.err.println(e.toString());
    }       
}