南大通用数据库-Gbase-8a-学习-02-存储过程及函数之执行动态Sql

一、小例子

(1)存储过程实现内容

按照给定的输入参数,插入相应的值,并将结果集赋予输出参数。

存储过程定义:

create procedure "SumVal"(in FilterVal int, out SumResult bigint)
begin
	#declare cur ref cursor;
	declare InsertSql text;
	
	set InsertSql = 'insert into czg values(?)';
	set @sqlstr = InsertSql;
	set @a = FilterVal;
	prepare stmt from @sqlstr;
	EXECUTE stmt using @a; 
	select count(*) into SumResult from czg where a = FilterVal;
	deallocate prepare stmt;
end; 

(2)测试步骤

生成czg表测试数据请查看之前的链接:《南大通用数据库-Gbase-8a-学习-01-存储过程及函数之IF、LOOP、LEAVE、SET》

gbase> select * from czg;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
+------+
10 rows in set (Elapsed: 00:00:00.00)

gbase> drop procedure if exists "SumVal";
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> DELIMITER //
gbase> create procedure "SumVal"(in FilterVal int, out SumResult bigint)
    -> begin
    -> #declare cur ref cursor;
    -> declare InsertSql text;
    -> 
    -> set InsertSql = 'insert into czg values(?)';
    -> set @sqlstr = InsertSql;
    -> set @a = FilterVal;
    -> prepare stmt from @sqlstr;
    -> EXECUTE stmt using @a; 
    -> select count(*) into SumResult from czg where a = FilterVal;
    -> deallocate prepare stmt;
    -> end; //
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> set @ParameterOut = 0;//
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> call SumVal(99,@ParameterOut);//
Query OK, 0 rows affected (Elapsed: 00:00:00.05)

gbase> select @ParameterOut;//
+---------------+
| @ParameterOut |
+---------------+
|             1 |
+---------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> select * from czg;//
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   99 |
+------+
11 rows in set (Elapsed: 00:00:00.00)

二、涉及的语法

(1)PREPARE

语法格式:

PREPARE stmt_name FROM preparable_stmt

语法解释:
准备语句,这个步骤会对Sql进行语法语义解析,后续如果根据此语句句柄执行Sql,可以跳过语法语义解析阶段,加快了Sql执行效率。

(2)EXECUTE

语法格式:

EXECUTE stmt_name [USING @var_name [, @var_name] ...]

语法解释:
执行相应Sql语句,并可以在执行时将参数带入。

(3)DEALLOCATE

语法格式:

DEALLOCATE PREPARE stmt_name

语法解释:
释放语句句柄,和(1)PREPARE 一一对应,避免造成资源不释放。

(4)@变量

语法格式:

@变量

语法解释:
会话级的变量,和declare定义的变量作用域不同,declare定义的变量作用域在begin和end之间。

(5)into

语法格式:

selectinto 变量 from 表名 [where 条件];

语法解释:
将查询的结果赋予变量。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值