GBase 是南大通用数据技术有限公司推出的自主品牌的数据库产品,目前在国内数据库市场具有较高的品牌知名度。
本篇内容使用版本为GBase 8a,由于gbase 8a基于mysql开发,所以语法与其有很多相似之处。
DROP PROCEDURE IF EXISTS anrpt.p_procedure_demo;
CREATE PROCEDURE anrpt.p_procedure_demo(IN v_month varchar)
/*
gbase 8a 存储过程小例子
*/
BEGIN
/*
声明变量(DECLARE),可以给默认值
*/
DECLARE v_sql text;
DECLARE p1 INT DEFAULT 1;
DECLARE v_month_last varchar(10);
DECLARE v_rowline INT DEFAULT 0;
DECLARE done INT DEFAULT 0;
DECLARE cnt INT DEFAULT 0;
DECLARE s_region varchar(20);
DECLARE stmp CHAR(255) DEFAULT '';
DECLARE p2 CHAR(255) DEFAULT '';
DECLARE p3 CHAR(255) DEFAULT '';
-- 定义变量必须在定义游标之前!!!
DECLARE cur REF CURSOR;
DECLARE cur_region CURSOR FOR select prod_analysis_type from anrpt.rpt_analysis_product_conf LIMIT 20;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
/*
条件判断( IF...THEN...ELSE...END IF)
*/
IF LENGTH(v_month) <> 6 THEN
SET v_month = date_format(NOW(),'%Y%m');
/*
给变量赋值(set)
*/
SET v_month_last = date_format(date_add(CONCAT(v_month,'01'), interval -1 month),'%Y%m'); -- 上月
END IF;
/*
执行动态SQL,支持输入参数
*/
drop table if exists tmp.rpt_analysis_product_conf;
SET v_sql = 'create table tmp.rpt_analysis_product_conf as select * from anrpt.rpt_analysis_product_conf where conf_seq = ? ';
/*
执行输出日志信息(SELECT)
*/
SELECT concat('v_sql is ', v_sql);
SET @sql_str = v_sql;
SET @sql_v_month = v_month;
PREPARE stmt FROM @sql_str;
EXECUTE stmt USING @sql_v_month;
/*
循环(LOOP END LOOP)
*/
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN
SELECT concat('p1 is ', p1);
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
/*
静态游标(CURSOR)
*/
SELECT concat('cnt is ', cnt);
OPEN cur_region;
REPEAT
FETCH cur_region INTO s_region;
IF NOT done THEN
SET cnt=cnt+2;
SELECT concat('s_region is ', s_region);
END IF;
UNTIL done END REPEAT;
CLOSE cur_region;
/*
动态游标(REF CURSOR)
*/
SET v_sql = 'select prod_analysis_type,prod_name from anrpt.rpt_analysis_product_conf';
SET @sql_str = v_sql;
OPEN cur FOR @sql_str;
FETCH cur INTO p2, p3;
SELECT concat(p2,' + ', p3);
END;
------------------------------------------------------------------------------------------
-- 查看创建函数脚本
SHOW CREATE PROCEDURE anrpt.p_procedure_demo;
-- 执行创建函数脚本
CALL anrpt.p_procedure_demo('1')