【GBase】gbase 8a存储过程示例

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')

 

你可能感兴趣的:(GBase)