触发器和存储过程的使用

1、在触发器中调用存储过程
    触发器的使用: http://blog.const.net.cn/a/7698.htm
    Attention:
    a、进行update的时候,不能修改触发表( sys_user )的数据。
    b、 innodb引擎上的数据,触发器sql执行sql失败会进行回滚
    c、 mysql触发器里不能包含动态sql语句,PREPARE之类的,这个在创建时一般会提示 mysql触发器里不能包含动态sql语句,PREPARE之类的,这个在创建时一般会提示
    
    
    
    
  1. DROP TRIGGER IF EXISTS `user_master`;
  2. CREATE TRIGGER `user_master` BEFORE UPDATE ON `sys_user`
  3. FOR EACH ROW 
  4. BEGIN
  5. DECLARE _user_type CHAR(20);
  6. DECLARE _type_infos_id char(20);
  7. SET _user_type = '1';
  8. IF new.ADVER_ID = NULL THEN
  9. SET _user_type = '0';
  10. END IF;
  11. CALL proc1(_user_type);
  12. set _type_infos_id =  proc2();
  13. INSERT INTO user_master_info (USERID,TYPE_ID,CREATE_TIME) VALUES (new.USER_ID,_type_infos_id,NOW());
  14. END;
2、在存储过程生成视图
    Attention:
    a、 存储过程的参数如果是输入中文的话,要在定义存储过程的后面加上character set gbk这个编码,不然调用存储过程使用中文参数的时候会出错。eg:
    
   
   
   
   
  1. create  procedure countpro(out a_out int,in b_date date, in unit_name varchar(45) character set gbk)

    
    
    
    
  1. DROP PROCEDURE IF EXISTS `proc1`;
  2. CREATE PROCEDURE `proc1`(IN type_m CHAR)
  3. BEGIN
  4. DROP VIEW IF EXISTS view_master_type;  
  5.     SET @sqlstr = 'CREATE VIEW view_master_type as';
  6.     SET @sqlstr = CONCAT(@sqlstr , 'SELECT * FROM master_type_info WHERE TYPE_MODE = ', type_m);
  7.     PREPARE stmt FROM @sqlstr;
  8.     EXECUTE stmt;
  9.     DEALLOCATE PREPARE stmt;
  10. END;
3、通过游标遍历视图筛选出来的集合,并返回值
    Attention:
         a、 游标只能向前读取

    
    
    
    
  1. DROP PROCEDURE IF EXISTS `proc2`;
  2. CREATE PROCEDURE `proc2`(OUT _type_ids CHAR)
  3. BEGIN
  4. DECLARE _b char(20);
  5. DECLARE _type_infos CHAR(20);
  6. DECLARE _found boolean DEFAULT true;
  7.   DECLARE _num CURSOR for SELECT TYPE_ID FROM view_master_type;
  8. DECLARE CONTINUE handler for NOT FOUND set _found = false;
  9. OPEN _num;
  10. FETCH _num into _b;
  11. while _found do
  12. set _type_infos = CONCAT(_b,',',_type_infos);
  13. FETCH _num into _b;
  14. END WHILE;
  15. CLOSE _num;
  16. set _type_ids = _type_infos;
  17. END;




来自为知笔记(Wiz)


你可能感兴趣的:(触发器和存储过程的使用)