我正在使用这个语法文件来解析一个sql文件,然后再将其发送到数据库:https://github.com/antlr/grammars-v4/blob/master/sql/plsql/PlSqlLexer.g4
目前它发现SQL语法中的错误,但不检测缺失;在指令的末尾:
Select * From d where d.DISCOUNTNAME = '2023'
BEGIN
Insert into DISCOUNT_MAIN_PARAM Values ('9922');
IF SQL%ROWCOUNT = 1 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END;
/
Select * From d where d.DISCOUNTNAME = '2023';
这显然会因为缺失而失败;在第一行,我怎么能绕过它呢?
1条答案
按热度按时间rlcwz9us1#
我在ANTLR 3的时代维护了这个语法,现在它进步了很多。你从ANTLR 4解析器得到什么错误?
;
-它只是sqlplus工具使用的分隔符。;
,因此sqlplus必须使用/
作为语句分隔符。(单独在线)ANTLR* 解析器应尽可能多地使用输入文本。还有可能的错误恢复,其中它可以跳过令牌或创建丢失的令牌。
在SQL语法的上下文中,您的“丢失”分号实际上并没有丢失。SQL中不允许使用分号,Oracle的SQL也没有任何特殊的“查询结束”关键字。
对于sqlplus工具语法,有一些由特殊sqlplus
keyword
和SQL/PLSQL语句引入的一行程序-这些语句必须用;
或/
分隔