【发布时间】:2014-12-25 14:42:54
【问题描述】:
我已经修改了 [Porcelli] (https://github.com/porcelli/plsql-parser) 给出的 PLSQL 解析器。我正在使用这个解析器来解析 PlSql 文件。我在解析 Insert..Select 语句时遇到问题,例如
insert into tname Select cname from tname2
但是如果我为插入语句提供列名,那么它将成功解析,例如
insert into tname (c1,c2) Select cname from tname2
Insert_statement 的语法存在于
insert_statement
: insert_key^
( single_table_insert
| multi_table_insert
)
;
// $<Insert - Specific Clauses
single_table_insert
: insert_into_clause
( values_clause static_returning_clause?
| select_statement
)
error_logging_clause?
-> ^(SINGLE_TABLE_MODE insert_into_clause values_clause? static_returning_clause? select_statement? error_logging_clause?)
;
insert_into_clause
: into_key general_table_ref
(LEFT_PAREN column_name (COMMA column_name)* RIGHT_PAREN)?
-> ^(into_key general_table_ref ^(COLUMNS column_name*))
;
不知道为什么它在第一种情况下会失败,即使语法处理了这种情况。
编辑:
我收到 NoViableException,这是堆栈跟踪,
Exception in thread "main" java.lang.RuntimeException: Parser Exception
NoViableAltException(33@[])
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.single_table_insert(PLSQLParser_PLSQL_DMLParser.java:12904)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.insert_statement(PLSQLParser_PLSQL_DMLParser.java:12806)
at br.com.porcelli.parser.plsql.PLSQLParser.insert_statement(PLSQLParser.java:36823)
at com.abc.xyz.main.PlSql.parse(PlSql.java:49)
at com.abc.xyz.main.PlSql.main(PlSql.java:41)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.reportError(PLSQLParser_PLSQL_DMLParser.java:821)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.single_table_insert(PLSQLParser_PLSQL_DMLParser.java:13058)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.insert_statement(PLSQLParser_PLSQL_DMLParser.java:12806)
at br.com.porcelli.parser.plsql.PLSQLParser.insert_statement(PLSQLParser.java:36823)
at com.abc.xyz.main.PlSql.parse(PlSql.java:49)
at com.abc.xyz.main.PlSql.main(PlSql.java:41)
【问题讨论】:
-
看来语法应该处理,错误信息是什么?
-
@lp_ - 我在问题中添加了错误消息。