Mysql存储过程、函数、触发器、游标 简易使用说明及示例

存储过程、函数、触发器、游标 简易使用说明及示例

存储过程

CREATE DEFINER=root@% PROCEDURE prod_test(IN p_name varchar(10))
BEGIN

select *
from rural_sys_org_user
where name like CONCAT(‘%’,p_name,‘%’);

END

调用存储过程

call prod_test(xxx);

存储过程示例(游标)

CREATE DEFINER=`root`@`%` PROCEDURE `add_cost_project`()
BEGIN
   #声明结束标识
   DECLARE end_flag int DEFAULT 0;

   DECLARE company_id int;
   DECLARE lease int;
   DECLARE dormitory int;

   # 声明游标 curosr
   DECLARE curosr CURSOR FOR SELECT id FROM sys_company where pid != 0 and id != 24;

   #设置终止标志
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET end_flag = 1;
--     DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_flag=1;

   # 打开游标
   OPEN curosr;

   # 遍历游标
   REPEAT
      #获取当前游标指针记录,取出值赋给自定义的变量
      FETCH curosr INTO company_id;
         #利用取到的值进行数据库的操作
         insert into cost_project
         (`pid`, `project`, `unit`, `rule_id`, `bill_type_id`, `create_time`, `company_id`) values
         (0, '房租类', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (0, '宿舍费用', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (0, '其它', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id);

         select id from cost_project where cost_project.company_id = company_id and project = '房租类' limit 1 into lease;
         select id from cost_project where cost_project.company_id = company_id and project = '宿舍费用' limit 1 into dormitory;

         insert into cost_project
         (`pid`, `project`, `unit`, `rule_id`, `bill_type_id`, `create_time`, `company_id`) values
         (lease, '环保基础设施费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (lease, '电梯维护费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (lease, '地下室租赁费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (lease, '剧毒仓库租赁费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (lease, '其它租赁费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (lease, '综合管理服务费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (lease, '保证金', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (dormitory, '宿舍租赁费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (dormitory, '宿舍电费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id),
         (dormitory, '宿舍水费', '之恩环保', 0, 1, '2022-12-01 00:00:00', company_id);

   # 根据 end_flag 判断是否结束
   UNTIL end_flag END REPEAT;

   #关闭游标
   close curosr;

   end;

   call add_cost_project();

注意其中的 limit 1,否则报错

局部变量company_id与字段名company_id重名时,表名.字段

其中使用了游标

函数

自定义函数与存储过程,主要区别为函数有return ;

系统自带常用函数:

  1. GROUP_CONCAT([DISTINCT] column1 [ORDER BY column2 ASC\DESC] [SEPARATOR seq])

    示例

    select GROUP_CONCAT(DISTINCT short_name ORDER BY short_name ASC SEPARATOR ‘,’)
    from (select short_name from sys_company
    where pid != 0
    ORDER BY short_name
    ) q

  2. cancat(a, b, c)

  3. if(end_flag = 0,“∞”,end_date)

  4. ifnull( , )

  5. case when then else end;

  6. date_format( time, ‘%Y%m%d’) = date_format( now(), ‘%Y%m%d’)

  7. DATE_SUB(curdate(), INTERVAL 0 MONTH) DATE_SUB(CURDATE(), INTERVAL 7 DAY)

  8. to_days()计算日期举例0000年1月1日的天数 year() QUARTER() month()

  9. round(123.3453,2) 四舍五入

自定义函数

语法

CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION functionName ( varName varType [, … ] )
RETURNS returnVarType
[characteristic …]
routine_body

说明

functionName:函数名,同MySQL内置函数一样,大小写不敏感
varName: 形参名
varType: 形参类型,其与varName配对使用。形参数量不限( ≥ 0 \geq 0≥0)
returnVarType: 返回值类型。函数必须有且只能有一个返回值
characteristic:函数特性,下将详述
routine_body:函数体。函数体中必须含有 return 语句,当函数体为复合结构时,需要使用begin … end 语句

示例

DROP FUNCTION if exists myfunTest KaTeX parse error: Expected 'EOF', got '#' at position 106: … #̲ 声明定义1个变量, 初值默认…
DELIMITER ;

触发器

语法

create trigger xxx before/after insert/delete/update on table_name

for each row +

  • 单条语句
  • begin 多条语句 end
  • set xxx = ddd
关键字

OLD.xxx以及 NEW.xxx

适用范围

insert after new

delete before old

update before/after new/old

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值