mysql 开荒基础连串17 存款和储蓄进程和函数(上

2019-10-11 12:10 来源:未知

一. 概述 

 存款和储蓄进程和函数是刚开始阶段经过编写翻译并蕴藏在数据库中的一段sql语句群集,能够简化使用开辟职员的成都百货上千干活,收缩多少在数据库与应用服务器之间的传导,升高数据管理功用是有利润的。存款和储蓄进度和函数的分化在于函数必需有重回值,存款和储蓄进程的参数可以接纳in,out ,inout类型,而函数参数只好是in类型。 创制须要create routine 权限, 修改删除要求alter routine权限,实践必要execute权限。

  1.1 创造存款和储蓄进程,调用,删除

-- 创建
DELIMITER $$
CREATE PROCEDURE proc_city(IN city_id INT ,OUT num INT)
READS SQL DATA
BEGIN
    --  要设置初始值,不然为null 与sqlserver一样
    SET num=0;
    SELECT * FROM city WHERE city.city_id=city_id;
    SET num=num 1;
END $$
DELIMITER ;

 --  调用
CALL proc_city (2,@num); SELECT @num;

彩民之家高手论坛 1彩民之家高手论坛 2

-- 删除
DROP  PROCEDURE proc_city

  特征值介绍:
  CREATE PROCEDURE proc_name()
    { contains sql | no sql | READS SQL DATA | modifies sql data}
  那一个特征值只是提需要服务器,并从未基于那么些特征值来约束进度实际上应用数据的情况。 contains sql 表示子程序不包括读或写多少的讲话。no sql表示子程序不含有sql 语句。 READS SQL DATA:表示子程序包蕴数据的口舌,但不包涵写多少。modifies sql data 表示子程序包涵写多少。默许是contains sql。

  1.2 创立函数,调用,删除

-- 创建
SET GLOBAL log_bin_trust_function_creators=TRUE;
DELIMITER $$
CREATE FUNCTION fn_city (city_count INT)
RETURNS INT 
BEGIN
DECLARE  city_count1 INT;
    --  要设置初始值,
    SET city_count1=0;
    SET  city_count1=city_count 1;
    RETURN city_count1;
END $$
DELIMITER ;

-- 调用
SELECT  fn_city (2);

彩民之家高手论坛 3

-- 删除
DROP FUNCTION fn_city

  1.3 查看音讯

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='proc_city' OR  ROUTINE_NAME='fn_city'

彩民之家高手论坛 4

  1.4 变量的采取

DELIMITER $$
CREATE PROCEDURE proc_demo_declare()
READS SQL DATA
BEGIN
    -- 定义 
    DECLARE i INT ;
    -- 赋值
    SET i=10;
    SELECT i;
    -- 第二种赋值
    SELECT COUNT(1) INTO i  FROM city;
    SELECT i;
END $$
DELIMITER ;

call proc_demo_declare;

      彩民之家高手论坛 5    彩民之家高手论坛 6

1.5 定义Handler际遇难题的管理步骤

--  语法
DECLARE
{EXIT | CONTINUE}
HANDLER FOR
{error-number | SQLSTATE error-STRING | CONDITION}
SQL statement

  (1) 管理项目{EXIT | CONTINUE} continue: 当碰着试行错误时,跳过继续上边包车型地铁语句。exit: 当蒙受施行错误时,甘休语句
  (2) 触发条件 (SQLSTATE,MYSQL E路虎极光RO智跑,CONDITION)MYSQL错误代码。ANSI-standard SQLSTATE code。命名准则。可使用系统内置的SQLEXCEPTION,SQLWAPRADONING和NOT FOUND。
  (3)错误触发的操作。

--   以continue为例
DELIMITER $$
CREATE PROCEDURE proc_demo_handler_continue()
BEGIN
    -- 定义条件 continue : 当遇到执行错误时,跳过继续下面的语句
    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;    

    -- 这条可以插入
    INSERT INTO  city(country_id,cityname,Citycode) VALUES(2,'中国','cn4');
    SET @x=1;

    -- 这条不能插入,外键约束fk_city_country
    INSERT INTO  city(country_id,cityname,Citycode) VALUES(8,'中国','cn5');
    SET @x=2;

    -- 这条可以插入
    INSERT INTO city(country_id,cityname,Citycode) VALUES(2,'中国','cn6');
    SET @x=3;
END $$
DELIMITER ;

-- 调用 
CALL proc_demo_handler_continue; SELECT @x,@x2;

  使用了continue: 当碰到推行错误时,跳过一而再上面包车型客车话语,三条语句,只插入成功二条成功

彩民之家高手论坛 7

  

--  以exit为例
DELIMITER $$
CREATE PROCEDURE proc_demo_handler_exit()
BEGIN
    -- 定义条件  : 当遇到执行错误时,停止语句  
    DECLARE EXIT HANDLER FOR SQLSTATE '23000' SET @x2 = 1;    

    -- 这条可以插入
    INSERT INTO  city(country_id,cityname,Citycode) VALUES(2,'中国','cn4');
    SET @x=1;

    -- 这条不能插入,外键约束fk_city_country
    INSERT INTO  city(country_id,cityname,Citycode) VALUES(8,'中国','cn5');
    SET @x=2;
    --  这条不可以插入
    INSERT INTO city(country_id,cityname,Citycode) VALUES(2,'中国','cn6');
    SET @x=3;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_handler_exit;SELECT @x,@x2;

  使用了exit: 当遇到实践错误时,结束语句, 三条语句,只插入成功首先条

彩民之家高手论坛 8

 

光标的选择

SQL Data Access

该证明只是提供一些音讯,并不会约束实际存款和储蓄进度的推增势况

  • CONTAINS SQL:未知(实验能够读写不会出标题)。

  • NO SQL:表示子程序不带有SQL语句。

  • READS SQL DATA:表示子程序包蕴读数据的话语,但不包涵写多少的话语。

  • MODIFIES SQL DATA:表示子程序包罗写多少的言语。

  • CONTAINS SQL 英特网大多的材质都评释是包涵sql数据,不带有读写的口舌, 认为笔者就冲突,怎会有不含有读写语句的储存进度,那要存款和储蓄进度做什么样,未有找到官方网址的文书档案,暗许就用contains sql不会出标题

概念法规

declare condition_name(自定义错误类似) condition for condition_value
condition_value:

  • sqlstate [value] sqlstate_value
  • mysql_error_code

关闭光标

close cursor_name

开采光标

open cursor_name

获得记录

fetch cursor_name into var_name,[var_name]...

SQL Security

  • sql secuirty的值决定了调用存款和储蓄进程的秘技,取值 :definer只怕invoker
  1. definer 钦点子程序该用创造子程序者的权杖来施行

  2. invoker 使用调用者的权柄来实施

definer 定义者

证实存储进程的定义者,只是说明存储进程的定义者,跟实行权限关系非常的小

概念管理

declare handler_type handler for condition_value sp_statement;
handler_type:

  • continue
  • exit
  • undo (要询问版本是或不是扶助)
    condition_value(即定义规则定义的名称):
  • SQLSTATE [value] sqlstate_value
  • condition_name
  • SQLWAOdysseyNING(sqlstate 以01初步的有的)
  • NOT FOUND(sqlstate 以02起来的一部分)
  • SQLEXCEPTION
  • mysql_error_code

赋值

  • set var_name = expr

评释光标

declare cursor_name cursor for select_statement

概念法规和管理

例子

CREATE DEFINER = `cdz`@`localhost` PROCEDURE `live_db`.`<function_name>`(IN i_platform_id int)

LANGUAGE SQL

NOT DETERMINISTIC

CONTAINS SQL

SQL SECURITY DEFINER

COMMENT '两小时统计一次作品数量'

BEGIN

    declare v_user_id  int default 0;

    declare stop int default 0;

    declare v_art_count int default 0;

    declare cur_ingkee cursor for (select distinct userId from newmedia_ingkee_art where updateTime >= date_sub(now(), interval 122 MINUTE));

    declare cur_yy cursor for (select distinct userId from newmedia_yy_art where updateTime >= date_sub(now(), interval 122 MINUTE));

    declare CONTINUE HANDLER FOR SQLSTATE '02000'SET stop = null;

    if i_platform_id=1 THEN

        open cur_ingkee;

        fetch cur_ingkee into v_user_id;

        while (stop is not null) DO

            select count(*) into v_art_count from newmedia_ingkee_art where userId = v_user_id;

            update newmedia_wanghong_users 

            set postCount = v_art_count

            where userId = v_user_id and platformId = i_platform_id;

            fetch cur_ingkee into v_user_id;

        end while;

    elseif i_platform_id=3 THEN

        open cur_yy;

        fetch cur_yy into v_user_id;

        while (stop is not null) DO

            select count(*) into v_art_count from newmedia_yy_art where userId = v_user_id;

            update newmedia_wanghong_users 

            set postCount = v_art_count

            where userId = v_user_id and platformId = i_platform_id;

            fetch cur_yy into v_user_id;

        end while;

    end if;

    commit;

end

循环获取光标的值

参数表达

DETERMINISTIC

老是调用存款和储蓄进度结果是还是不是鲜明的

TAG标签: MySQL
版权声明:本文由彩民之家高手论坛发布于彩民之家高手论坛,转载请注明出处:mysql 开荒基础连串17 存款和储蓄进程和函数(上