您现在的位置是:首页 >技术交流 >lightdb ecpg 支持匿名块绑定参数网站首页技术交流
lightdb ecpg 支持匿名块绑定参数
简介lightdb ecpg 支持匿名块绑定参数
LightDB ecpg 支持匿名执行块绑定参数
LightDB 从 23.2 版本开始支持在 ecpg 中使用绑定参数的匿名执行块。
一. 背景
一些 oracle 业务之前使用了oracle 的 proc 功能在 C 代码中嵌入 SQL 代码来操作数据库,然后主要是使用匿名块来执行 SQL,示例如下:
EXEC SQL EXECUTE
begin
begin
update/*3631412*/ t1 set c = 'C' where id = :v_error_no;
exception
when others then
:iReturnCode = 456;
rollback;
when DUP_VAL_ON_INDEX then
null;
if SQL%NOTFOUND then
null;
end if;
end;
end;
END-EXEC;
在 LightDB 中 proc 对应的就是 ecpg , 但 ecpg 之前是不支持上述用法的。
首先是不支持oracle 匿名块, 然后是不支持匿名块中绑定参数(:v_error_no 形式)。
二. 支持匿名执行块绑定参数
从 23.2 版本开始支持对匿名执行块绑定参数(目前只支持plorasql)。
故只需把上述匿名块改为匿名执行块即可。上述代码修改如下(修改头,尾即可):
exec sql begin declare section;
int iReturnCode = 1;
int v_error_no = 1;
exec sql end declare section;
exec sql create table t1(
id integer,
t text,
d1 numeric,
d2 float8,
c char(10));
exec sql insert into t1 values
(1, 'a', 1.0, 1, 'a'),
(2, null, null, null, null),
(4, 'd', 4.0, 4, 'd');
EXEC SQL
do $$
begin
begin
update/*3631412*/ t1 set c = 'C' where id = :v_error_no;
exception
when others then
:iReturnCode = 456;
rollback;
when DUP_VAL_ON_INDEX then
null;
if SQL%NOTFOUND then
null;
end if;
end;
end;
$$ language plorasql;
ecpg 会解析执行块中的 :variable
作为输入输出参数,以上述代码为例,会把上述匿名执行块转为如下的形式,作为 prepare stmt 发送给数据库。
do $$
begin
begin
update/*3631412*/ t1 set c = 'C' where id = $1;
exception
when others then
$2 = 456;
rollback;
when DUP_VAL_ON_INDEX then
null;
if SQL%NOTFOUND then
null;
end if;
end;
end;
$$ (int, int) using ($1, $2) language plorasql;
$$ block $$
的block 相当于存储过程的block, (int, int) 相当于存储过程的入参定义, using ($1, $2)
作为 调用存储过程传入的参数, 绑定v_error_no作为$1, iReturnCode 作为 $2。
三. Note
- 只支持 lanuage 为plorasql 的dostmt。
- 参数都为输入输出参数,执行后参数值可能被修改。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。