如何使用plsql解析器(ANTLR)

如何使用plsql解析器(ANTLR),plsql,antlr,Plsql,Antlr,我想检查自动化测试中的PL/SQL查询语法,它看起来可能对这一点很有用。我不容易找到我将如何安装和使用它,虽然 请注意,这是一个Ruby项目,但我在Java方面有相当的能力。我希望有某种方法可以通过控制台运行检查,传入SQL,并返回任何错误信息,包括行/列 谢谢。 下载ANTLR工具3.5.1版 从下载源代码(此版本已移植到3.5.1) 使用该工具从poarsers/no ast子目录编译源代码 第一次编译PLSQLLexer.g 第二步从no ast subdr编译PLSQLParser.g

我想检查自动化测试中的PL/SQL查询语法,它看起来可能对这一点很有用。我不容易找到我将如何安装和使用它,虽然

请注意,这是一个Ruby项目,但我在Java方面有相当的能力。我希望有某种方法可以通过控制台运行检查,传入SQL,并返回任何错误信息,包括行/列

谢谢。

  • 下载ANTLR工具3.5.1版
  • 从下载源代码(此版本已移植到3.5.1)
  • 使用该工具从poarsers/no ast子目录编译源代码
  • 第一次编译PLSQLLexer.g
  • 第二步从no ast subdr编译PLSQLParser.g
  • 将此示例代码用作示例:

为什么要检查哪种陈述?您可以连接到Oracle服务器吗?因为
DBMS\u SQL.PARSE
也可以验证语句。在这种情况下,在实际生产环境之外,我们既不能使用在生产环境中访问的Oracle服务器/数据库,也不能使用任何其他Oracle数据库服务器。我希望我们能尽快改变这种情况,但至少提前知道SQL在语法上是正确的会有所帮助。我们现在正在手动检查,方法是打印生成的SQL并将其粘贴到支持Oracle的一个SQL格式化网站中。我假设您是从ruby动态生成SQL或匿名pl/SQL块,然后在Oracle中运行它们?(有时由于语法原因而失败?)。如果是这样,为什么不在Oracle中创建一个包/过程/函数,它将接受您的SQL并为您解析它(按照ahorsewithnoname的建议使用dbms_SQL.parse),返回任何错误。@tbone,问题是“在Oracle中运行它们”部分。目前,我们无法访问任何Oracle服务器来解析它们。当然,我确实打算在将来尝试这样做,所以这也许是最好的答案。我希望ANLTR解析器同时也是一个简单的解决方案。也许,这并不是那么简单?@a_horse_和_no_name恐怕DBMS_SQL.PARGE只支持纯SQL,而不支持PL/SQL。此外,mentined解析器有点放松。在某些情况下,它接受语法不正确的输入。而且它也不能发现任何语义错误。谢谢。我来试试。你成功了吗,@SteveJorgensen?恐怕我再也记不起我是否成功了。如果我需要再试一次,至少我有这个作为参考。构建它需要多少时间?我正在做这件事,感觉它花费了太多的时间,而控制台什么也没显示出来。
    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());
    }       
}