背景
oracle
存储过程中不带参数声明的游标,可以在open打开时加上括号进行调用。在老的业务中经常能够看到这种用法。虽然觉得不合理,但是oracle人家支持,作为兼容性极强的LightDB不会在这个小水沟翻车的,果断进行支持一波。
LightDB
在对存储过程open游标进行语法解析时,将不带参数定义的游标,调用时带有括号的形式判定为语法错误,因此我们需要修改这一段逻辑。
方法
由于open使用的这种方式一般括号都在最右边,因此我们在进行语法检测时,发现不带参数,就首先检测是否带左括号,如果为真,判断是否带右括号;如果还为真就返回成功。否则,报语法错误。
测试
首先建立一张表,并插入数据
create table open_with_parens(id int, name varchar(100), score number);
insert into open_with_parens values (12, 'chd', 99);
声明一个存储过程
create or replace procedure proc_with_parens(id int) as
cursor c_with_parens is select * from open_with_parens;
begin
open c_with_parens();
close c_with_parens;
end;
调用存储过程
call proc_with_parens(12);
但是经过上面的测试我们是否会有一个担心,如果是open for打开游标的格式,测试一下:
create or replace procedure proc_with_parens(id int) as
c_with_parens sys_refcursor;
begin
open c_with_parens() for select * from open_with_parens;
close c_with_parens;
end;
oracle报错,LightDB也报错。那就ok了。