您现在的位置是:首页 >技术交流 >lightdb ecpg 支持匿名块绑定参数网站首页技术交流

lightdb ecpg 支持匿名块绑定参数

紫无之紫 2024-10-21 12:01:05
简介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

  1. 只支持 lanuage 为plorasql 的dostmt。
  2. 参数都为输入输出参数,执行后参数值可能被修改。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。