存储过程,函数,触发器,视图的使用

存储过程

存储过程(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
BEGIN

 guid := 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 BEGIN

SET @x := (
    SELECT
        MAX(employee_id)
    FROM
        oyk_employee
);


SET NEW.employee_id = @x + 1;

视图:

报表系统开发初期的时候,数仓开发通过开发视图来提供临时的数据用于开发测试.后期才会把视图换成实际表

猜你喜欢

转载自blog.csdn.net/qq_24271537/article/details/113211096