oracle ANTRL plsql语法不检测缺失;

nfzehxib  于 2023-05-16  发布在  Oracle
关注(0)|答案(1)|浏览(134)

我正在使用这个语法文件来解析一个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';

这显然会因为缺失而失败;在第一行,我怎么能绕过它呢?

rlcwz9us

rlcwz9us1#

我在ANTLR 3的时代维护了这个语法,现在它进步了很多。你从ANTLR 4解析器得到什么错误?

  • SQL语法不包含;-它只是sqlplus工具使用的分隔符。
  • PL/SQL语法包含;,因此sqlplus必须使用/作为语句分隔符。(单独在线)

ANTLR* 解析器应尽可能多地使用输入文本。还有可能的错误恢复,其中它可以跳过令牌或创建丢失的令牌。
在SQL语法的上下文中,您的“丢失”分号实际上并没有丢失。SQL中不允许使用分号,Oracle的SQL也没有任何特殊的“查询结束”关键字。
对于sqlplus工具语法,有一些由特殊sqlplus keyword和SQL/PLSQL语句引入的一行程序-这些语句必须用;/分隔

相关问题