存储过程
存储过程(Stored Procedure)是在数据库中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(可选)来执行
存储过程的优点
- 预编译SQL,提升执行效率
- 可以隐藏执行逻辑,只暴露名称和参数
- 相较于程序来说,修改起来更加便捷
存储过程的缺点
- 随着SQL行数的增加,维护复杂度呈线性提升
- 无法调试,迭代过程中风险较高
格式
delimiter //
drop procedure if exists p1;
//
create procedure p1()
begin
declare var1 int default 0;
set var1 = 1;
while var1 <700000 DO
set var1 = var1 + 4;
INSERT INTO oyk_record_charging (organization_id,account_uid, cabinet_uid,charging_type, charging_status, return_battery_id, get_battery_id, return_box_id, get_box_id)
VALUES('23',REPLACE(UUID(),'-',''),REPLACE(UUID(),'-',''),'1','-1','G0014802512BLD0190703001','G0014802512BLD0190703002','184','183');
end while;
select var1;
end;
//
call p1();
//
=============================
#有参数的存储过程
drop procedure if exists p2;
//
create procedure p2(in a int, out b int)
begin
set b = a*a;
end;
//
call p2(5, @v1); //
select @v1; //
函数
create function fn1(a int) --函数可以replace,存储过程不可以
returns varchar(255) --定义返回类型
begin
declare r int;
set r = a*a;
return r;
end;
存储过程和函数的区别:
函数必须有返回值
函数是拿来重用的(被各种存储过程,SELECT语句调用) , 存储过程是拿来解决某一个具体问题的. (比如出这个月的商品销售数据)
视图:
而一个或多个表依照某个条件组合而成的结果集 ; 视图是虚拟的内存表
使用:
create or replace view v1
as
查询语句
触发器:
触发器是与表有关的数据库对象 ,在满足定义条件时触发
使用:
delimiter //
create trigger tb1_trigger_insert
before insert on tb1 for each row
begin
set new.created=now();
set new.updated=now();
end;
//
项目中的实际使用:
存储过程:
之前项目中帮测试写了一个存储过程,用来插入大量数据,用来测试
delimiter //
drop procedure if exists p1;
//
create procedure p1()
begin
declare var1 int default 0;
set var1 = 1;
while var1 <700000 DO
set var1 = var1 + 4;
INSERT INTO oyk_record_charging (organization_id,account_uid, cabinet_uid,charging_type, charging_status, return_battery_id, get_battery_id, return_box_id, get_box_id)
VALUES('23',REPLACE(UUID(),'-',''),REPLACE(UUID(),'-',''),'1','-1','G0014802512BLD0190703001','G0014802512BLD0190703002','184','183');
end while;
select var1;
end;
//
call p1();
//
函数:
用于创建自定义的uuid
CREATE OR REPLACE
FUNCTION "RPTEYADM"."GET_UUID" AS
BEGINguid := sys_guid();
RETURN
substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12);
END GET_UUID;
触发器:
-- ----------------------------
-- Triggers structure for table manager_employee
-- ----------------------------
DROP TRIGGER IF EXISTS `oyk_employee_before_insert`;
delimiter ;;
CREATE TRIGGER `oyk_employee_before_insert` BEFORE INSERT ON `manager_employee` FOR EACH ROW BEGINSET @x := (
SELECT
MAX(employee_id)
FROM
oyk_employee
);
SET NEW.employee_id = @x + 1;
视图:
报表系统开发初期的时候,数仓开发通过开发视图来提供临时的数据用于开发测试.后期才会把视图换成实际表