精华内容
下载资源
问答
  • MySQL存储函数

    千次阅读 2019-01-11 17:38:43
    MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。 1、创建存储函数 在MySQL中,创建存储函数使用CREATE FUNCTION关键字,其基本形式如下: CREATE ...

    MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。

    1、创建存储函数

    在MySQL中,创建存储函数使用CREATE FUNCTION关键字,其基本形式如下:

    CREATE FUNCTION func_name ([param_name type[,...]])
    RETURNS type
    [characteristic ...] 
    BEGIN
    	routine_body
    END;

    参数说明:

    (1)func_name :存储函数的名称。

    (2)param_name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。

    (3)RETURNS type:指定返回值的类型。

    (4)characteristic:可选项,指定存储函数的特性。

    (5)routine_body:SQL代码内容。

    2、调用存储函数

    在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法基本相同。用户自定义的存储函数与MySQL内部函数性质相同。区别在于,存储函数是用户自定义的。而内部函数由MySQL自带。其语法结构如下:

    SELECT func_name([parameter[,…]]);

    示例:创建存储函数,实现根据用户编号,获取用户姓名功能。

    (1)先创建tb_user(用户信息表),并添加数据。

    -- 创建用户信息表
    CREATE TABLE IF NOT EXISTS tb_user
    (
    	id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
    	name VARCHAR(50) NOT NULL COMMENT '用户姓名'
    ) COMMENT = '用户信息表';
    
    -- 添加数据
    INSERT INTO tb_user(name) VALUES('pan_junbiao的博客');
    INSERT INTO tb_user(name) VALUES('KevinPan');
    INSERT INTO tb_user(name) VALUES('pan_junbiao');
    INSERT INTO tb_user(name) VALUES('阿标');
    INSERT INTO tb_user(name) VALUES('panjunbiao');
    INSERT INTO tb_user(name) VALUES('pan_junbiao的CSDN博客');
    INSERT INTO tb_user(name) VALUES('https://blog.csdn.net/pan_junbiao');

    查询数据结果:

    (2)创建存储函数

    -- 创建存储函数
    DROP FUNCTION IF EXISTS func_user;
    CREATE FUNCTION func_user(in_id INT)
    RETURNS VARCHAR(50)
    BEGIN
    	DECLARE out_name VARCHAR(50);
    
    	SELECT name INTO out_name FROM tb_user
    	WHERE id = in_id;
    
    	RETURN out_name;
    END;

    (3)调用存储函数

    -- 调用存储函数
    SELECT func_user(1);
    SELECT func_user(2);
    SELECT func_user(3);
    SELECT func_user(4);
    SELECT func_user(5);
    SELECT func_user(6);
    SELECT func_user(7);

    执行结果:

    3、修改存储函数

    MySQL中,通过ALTER FUNCTION 语句来修改存储函数,其语法格式如下:

    ALTER FUNCTION func_name [characteristic ...]
    characteristic:
        COMMENT 'string'
      | LANGUAGE SQL
      | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
      | SQL SECURITY { DEFINER | INVOKER }

    上面这个语法结构是MySQL官方给出的,修改的内容可以包含SQL语句也可以不包含,既可以是读数据的SQL也可以是修改数据的SQL还有权限。此外在修改function的时候还需要注意你不能使用这个语句来修改函数的参数以及函数体,如果你想改变这些的话你就需要删除掉这个函数然后重新创建。

    4、删除存储函数

    MySQL中使用DROP FUNCTION语句来删除存储函数。

    示例:删除存储函数。

    DROP FUNCTION IF EXISTS func_user;

     

    其它补充:

    如果你在创建存储函数时提示以下错误:

    [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is
    enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

    这是我们开启了bin-log, 我们就必须指定我们的函数是否是
    1 DETERMINISTIC 不确定的
    2 NO SQL 没有SQl语句,当然也不会修改数据
    3 READS SQL DATA 只是读取数据,当然也不会修改数据
    4 MODIFIES SQL DATA 要修改数据
    5 CONTAINS SQL 包含了SQL语句

    其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

    解决方法:

    解决办法也有两种, 第一种是在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个, 例如: CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()     DETERMINISTIC BEGIN #Routine body goes here... END;;

    第二种是信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。

    设置方法有三种:

    (1)在客户端上执行 SET GLOBAL log_bin_trust_function_creators = 1。

    (2)MySQL启动时,加上--log-bin-trust-function-creators选贤,参数设置为1。

    (3)在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1。

    展开全文
  • mysql 存储函数

    千次阅读 2018-06-13 23:41:17
    #定义函数 delimiter $$ create function getGameName(gameid int) returns VARCHAR(45) DETERMINISTIC begin declare name VARCHAR(45); set name=(select gamename from cy_game where id=gameid); return (n.....
    #定义函数
    delimiter $$
    create function getGameName(gameid int) returns VARCHAR(45)
    DETERMINISTIC
    begin
       declare name VARCHAR(45);
       set name=(select gamename from cy_game where id=gameid);
       return (name);
    end$$
    delimiter;
    
    select getGameName(4);#使用
    select id,getGameName(4) from cy_game where id=4;#使用

       show function status;     //函数

       show create function func_name;

    DELIMITER $$  
    drop function if exists getPayOkSettlementAgent;
    CREATE FUNCTION getPayOkSettlementAgent(regagent varchar(45)) returns VARCHAR(45)  
    DETERMINISTIC  
    BEGIN  
       DECLARE userId,secondAgentUserId,oneAgentUserId,settlementId,secondAgentSettlementId,oneAgentSettlementId int;  
       DECLARE curAgent,secondAgent,oneAgent,settlementAgent varchar(45); 
       
       SELECT id,agent,second_agent,one_agent INTO userId,curAgent,secondAgent,oneAgent FROM cy_ct_cps_user WHERE agent=regagent;
       SET settlementId=(select id from cy_ct_cps_settlement where uid=userId and status=0);  
       
       IF(settlementId) THEN
    	  SET settlementAgent=curAgent;
       ELSE 
          SELECT id INTO secondAgentUserId FROM cy_ct_cps_user WHERE agent=secondAgent;
          SET secondAgentSettlementId=(select id from cy_ct_cps_settlement where uid=secondAgentUserId and status=0);  
          IF(secondAgentSettlementId) then
    		     SET settlementAgent=secondAgent;
    	    ELSE 
    	       SELECT id INTO oneAgentUserId FROM cy_ct_cps_user WHERE agent=oneAgent;
             SET oneAgentSettlementId=(select id from cy_ct_cps_settlement where uid=oneAgentUserId and status=0);  
    		     IF(oneAgentSettlementId) THEN
    		        SET settlementAgent=oneAgent;
    		     ELSE 
    		        SET settlementAgent='';
    		     END IF;
    	    END IF;
       END IF;
       
       RETURN (settlementAgent);  
    END$$  
    DELIMITER;  

    //创建函数
    create function addAge(age int) returns int
        return age + 5;
    //使用函数:
    select addAge(age) from temp;
    //删除函数
    drop function if exists addAge;
    drop function addAge;
    //显示创建语法
    show create function addAge;


    存储的函数是返回单个值的特殊类型的存储程序。您使用存储的函数来封装在SQL语句或存储的程序中可重用的常用公式或业务规则。

    存储过程不同,您可以在SQL语句中使用存储的函数,也可以在表达式中使用。 这有助于提高程序代码的可读性和可维护性。

    MySQL存储函数语法

    以下说明了创建新存储函数的最简单语法:

    CREATE FUNCTION function_name(param1,param2,)
        RETURNS datatype
       [NOT] DETERMINISTIC
     statements
    
    SQL

    首先,在CREATE FUNCTION子句之后指定存储函数的名称。
    其次,列出括号内存储函数的所有参数。 默认情况下,所有参数均为IN参数。不能为参数指定INOUTINOUT修饰符。
    第三,必须在RETURNS语句中指定返回值的数据类型。它可以是任何有效的MySQL数据类型
    第四,对于相同的输入参数,如果存储的函数返回相同的结果,这样则被认为是确定性的,否则存储的函数不是确定性的。必须决定一个存储函数是否是确定性的。 如果您声明不正确,则存储的函数可能会产生意想不到的结果,或者不使用可用的优化,从而降低性能。
    第五,将代码写入存储函数的主体中。 它可以是单个语句或复合语句。 在主体部分中,必须至少指定一个RETURN语句。RETURN语句用于返回一个值给调用者。 每当到达RETURN语句时,存储的函数的执行将立即终止。

    MySQL存储函数示例

    我们来看一下使用存储函数的例子,这里将使用示例数据库(yiibaidb)中的customers表进行演示。

    以下示例是根据信用额度返回客户级别的功能。 我们使用IF语句来确定信用额度。

    DELIMITER $$
    
    CREATE FUNCTION CustomerLevel(p_creditLimit double) RETURNS VARCHAR(10)
        DETERMINISTIC
    BEGIN
        DECLARE lvl varchar(10);
    
        IF p_creditLimit > 50000 THEN
     SET lvl = 'PLATINUM';
        ELSEIF (p_creditLimit <= 50000 AND p_creditLimit >= 10000) THEN
            SET lvl = 'GOLD';
        ELSEIF p_creditLimit < 10000 THEN
            SET lvl = 'SILVER';
        END IF;
    
     RETURN (lvl);
    END $$
    DELIMITER ;
    
    SQL

    现在,我们在SELECT语句中调用CustomerLevel()存储函数,如下所示:

    SELECT 
        customerName, CustomerLevel(creditLimit)
    FROM
        customers
    ORDER BY customerName;
    
    SQL

    执行上面查询语句,得到以下结果 -

    +------------------------------------+----------------------------+
    | customerName                       | CustomerLevel(creditLimit) |
    +------------------------------------+----------------------------+
    | Alpha Cognac                       | PLATINUM                   |
    | American Souvenirs Inc             | SILVER                     |
    | Amica Models & Co.                 | PLATINUM                   |
    | ANG Resellers                      | SILVER                     |
    | Anna's Decorations, Ltd            | PLATINUM                   |
    | Anton Designs, Ltd.                | SILVER                     |
    | Asian Shopping Network, Co         | SILVER                     |
    | Asian Treasures, Inc.              | SILVER                     |
    | Atelier graphique                  | GOLD                       |
    | Australian Collectables, Ltd       | PLATINUM                   |
    | Australian Collectors, Co.         | PLATINUM                   |
    |************** 此处省略了一大波数据 *********************************|
    | Vitachrome Inc.                    | PLATINUM                   |
    | Volvo Model Replicas, Co           | PLATINUM                   |
    | Warburg Exchange                   | SILVER                     |
    | West Coast Collectables Co.        | PLATINUM                   |
    +------------------------------------+----------------------------+
    122 rows in set
    
    Shell

    下面,来重写在MySQL IF语句教程中开发的GetCustomerLevel()存储过程,如下所示:

    DELIMITER $$
    
    CREATE PROCEDURE GetCustomerLevel(
        IN  p_customerNumber INT(11),
        OUT p_customerLevel  varchar(10)
    )
    BEGIN
        DECLARE creditlim DOUBLE;
    
        SELECT creditlimit INTO creditlim
        FROM customers
        WHERE customerNumber = p_customerNumber;
    
        SELECT CUSTOMERLEVEL(creditlim) 
        INTO p_customerLevel;
    END $$
    DELIMITER ;
    
    SQL

    如您所见,GetCustomerLevel()存储过程在使用CustomerLevel()存储函数时可读性更高。

    请注意,存储函数仅返回单个值。 如果没有包含INTO子句的SELECT语句,则将会收到错误。

    另外,如果存储的函数包含SQL语句,则不应在其他SQL语句中使用它; 否则,存储的函数将减慢查询的速度。

    参考:https://www.yiibai.com/mysql/stored-function.html

    展开全文
  • 主要给大家介绍了关于MySQL自定义函数存储过程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 主要介绍了Mysql存储过程和函数的区别,需要的朋友可以参考下
  • mysql代码-MYSQL存储函数
  • mysql存储函数 参数 varchar 报错问题

    千次阅读 2018-10-03 21:49:48
    Mysql Navicat 中声明存储函数如果报如下错误,应该是你传入的varchar参数没有声明长度所导致的。加上长度即可。     这样就解决了错误  

    Mysql  Navicat  中声明存储函数如果报如下错误,应该是你传入的varchar参数没有声明长度所导致的。加上长度即可。

     

     

    这样就解决了错误

     

    展开全文
  • mysql存储过程,存储函数练习,里面有详细代码,供大家参考
  • 主要介绍了Python调用MySQL存储过程并获得返回值的方法,涉及Python操作MySQL存储过程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 开始之前 首先创建如下两张表,并初始化一些数据。 创建存储过程(CREATE PROCEDURE) ...基本语法格式如下: ...CREATE PROCEDURE sp_name (parameters) ...sp_name为存储过程的名称(唯一性,没有所谓的重...

    开始之前

    首先创建如下两张表,并初始化一些数据。

    创建存储过程(CREATE PROCEDURE)

    基本语法格式如下:

    CREATE PROCEDURE sp_name (parameters)
    [characteristics ...] routine_body

    其中:CREATE PROCEDURE为创建存储过程的关键字;sp_name为存储过程的名称(唯一性,没有所谓的重载方法概念);parameters为参数列表;characteristics指定存储过程的特性(该部分可以省略,即使用默认声明);routine_body是SQL代码的内容,可以用BEGIN...END来表示SQL代码的开始和结束。

    parameters 表现形式 --> [IN(OUT/INOUT)] param_name type。IN代表入参、OUT代表出参、INOUT代表既可以是入参也可以是出参, param_name参数名称,type是类型(类型是mysql数据库中支持的任意类型,VARCHAR需要指定长度,如VARCHAR(255))。

    characteristics 表现形式 --> 

    名称说明
    LANGUAGE SQL说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值
    [NOT] DETERMINISTIC指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为 NOT DETERMINISTIC
    {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句;NO SQL表明子程序不包含SQL语句;READS SQL DATA说明子程序包含读写读数据的SQL语句;MODIFIES SQL DATA表明子程序包含写数据的语句;默认情况下,系统会指定为CONTAINS SQL。
    SQL SECURITY {DEFINER | INVOKER}指明谁有权限来执行。DEFINER表示只有定义者才能执行。INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER
    COMMENT 'string'注释信息,可以用来描述存储过程或存储函数。

    --简单的示例

    DELIMITER $$  -- 声明结束符
    CREATE PROCEDURE list_emp() -- 创建无参数存储过程
    	COMMENT '查询所有员工及其所在部门' -- characteristics 部分(可以省略)
    	BEGIN
    		SELECT * FROM tb_emp e
    		INNER JOIN tb_dept d
    		ON e.dept_id = d.dept_id;
    	END $$
    DELIMITER ; -- 恢复默认结束符
    
    CALL list_emp(); -- 调用存储过程
    
    SHOW PROCEDURE STATUS LIKE '%list_emp%'; -- 查看存储过程
    
    DROP PROCEDURE list_emp;  -- 删除存储过程,目前编写错误的话直接删除重写

    存储过程定义详情(SHOW PROCEDURE STATUS LIKE '%list_emp%'; -- 查看存储过程):

    执行结果(CALL list_emp(); -- 调用存储过程):

    --有参数的存储过程

    DELIMITER $$
    CREATE PROCEDURE count_emp(OUT total_emp INT)
    	COMMENT '统计员工数量'
    	BEGIN
    		SELECT COUNT(*) INTO total_emp FROM tb_emp;
    	END $$
    DELIMITER ;
    
    SET @total_emp = 10; -- 声明变量
    
    CALL count_emp(@total_emp); -- 调用存储过程
    
    SELECT @total_emp; -- 获取结果
    
    DROP PROCEDURE count_emp; -- 删除存储过程

    执行结果:

    总结说明

    1、这里的'DELIMITER $$'语句的作用是将mysql的结束符号设置为'$$',因为mysql默认的结束符号是';',为了避免与存储过程中的SQL语句结束符号冲突,需要使用'DELIMITER'改变存储过程的结束符,并以'END $$'结束存储过程。存储过程定义完毕再以'DELIMITER ;'恢复默认结束符号。亦可以指定其它符号为结束符,但是不能用反斜杠'\',它是mysql中的转义符。当然,简单的存储过程不更改结束符大多数情况下也是不会出现错误的。

    2、有参数的时候,VARCHAR类型需要指定长度,比如VARCHAR(255)。

    创建存储函数(CREATE FUNCTION)

    基本语法格式如下:

    CREATE FUNCTION func_name(params)
    RETURNS type
    [characteristics ...] routine_body

    其中:CREATE FUNCTION为创建存储函数的关键字;func_name为存储函数的名称(唯一性,没有所谓的重载方法概念);params为参数列表;RETURNS type语句表示函数返回数据的类型,可以是mysql中的任意数据类型;characteristics指定存储函数的特性(和存储过程一样);routine_body是存储函数主体。

    参数列表:IN、OUT、或INOUT只对PROCEDURE是合法的(FUNCTION中总是默认IN参数,所以声明存储函数入参的时候不不能声明IN,会报错,因为默认是IN)。RETURNS子句只能对FUNCTION作指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

    -- 简单的示例:

    DELIMITER $$ -- 更改结束符
    CREATE FUNCTION count_dept()
    	RETURNS INT
    	COMMENT '统计部门数量'
    	BEGIN
    		RETURN (SELECT COUNT(*) FROM tb_dept);
    	END $$
    DELIMITER ; -- 还原结束符
    
    DROP FUNCTION count_dept; -- 删除存储函数
    
    SHOW FUNCTION STATUS LIKE '%count_dept%';  -- 查看存储函数定义
    
    SELECT count_dept();  -- 调用存储函数

    执行结果(SELECT count_dept();  -- 调用存储函数):

    变量的使用(关键字:DECLARE)

    变量可以在子程序中声明并使用,这些变量的作用域范围是在BEGIN...END程序中,不能单独在存储过程外部声明变量

    1、定义变量

    基本语法:

    DECLARE var_name[,var_name1]... date_type [DEFAULT value];

    var_name是局部变量的名称,可以同时声明多个变量,但是类型只能声明一次,就是说声明多个变量只能是同类型;date_type是变量类型,可以是mysql中任意的数据类型(VARCHAR需要指明长度,例如VARCHAR(255));DEFAULT 为变量设置默认值,如果是多参数,不能使用,默认值可以被声明为常量,也可以指定一个表达式。如果没有指定默认值,则为null

    简单的示例:

    DECLARE param1 INT DEFAULT 10; -- 声明单参数
    
    DECLARE param1, param2, param3 INT; -- 声明多参数

    2、为变量赋值

    定义变量后,可以为变量赋值以改变其值。

    通过SET...为变量赋值,基本语法:

    SET var_name = expr[,var_name=wxpr]....; -- 可以同时为单个或多个变量赋值,expr可以是具体的值,也可以是表达式。

    --简单的示例

    DECLARE param1, param2, param3 INT; -- 声明3个变量
    SET param1=10, param2=20; -- 为param1和param2赋具体的值
    SET param3 = param1 + param2; -- 将param1和param2的运算结果赋值给param3

    通过SELECT...INTO...为一个或多个变量赋值,基本语法如下:

    SELECT col_name[,...] INTO var_name[,...] table_expr;

    这个SELECT语法把选定的列直接存储到对应位置的变量(所以要求col_name和var_name一一对应)。col_name表示字段名称,var_name表示定义的变量名称;table_expr表示查询条件表达式,包括名称和WHERE子句。

    --简单的示例:

    SELECT dept_name, dept_addr INTO v_dept_name, v_dept_addr FROM tb_dept WHERE dept_id = 1;

    事务的使用

    事务并不会影响存储过程或存储函数的执行顺序,也不会中断执行(存储过程或存储函数始终会执行到END)。

    START TRANSACTION; -- 开始事务
    
    COMMIT; -- 提交事务
    
    ROLLBACK; -- 回滚事务

    流程控制的使用

    流程控制语句用来根据条件,控制语句的执行。mysql中用来构造控制流程的语句有:IF、CASE、LOOP、LEAVE、ITERATE、REPEAT、WHILE。

    IF语句(说明:mysql中还有一个IF()函数,注意区别):

    注意:IF语句必须配合THEN、END IF使用。除了IF还有ELSEIF(没有分开)和ELSE。

    基本语法:

    IF (expr_condition) THEN
    	....do something.....
    ELSEIF (expr_condition) THEN
    	....do something.....
    ELSE
    	....do something.....
    END IF;

    说明:如果表达式expr_condition计算结果为true,则执行THEN后面的逻辑,如果都不匹配则执行ELSE。条件判断表达式建议用括号包起来,增加可读性。

    CASE语句

    CASE语句也是一个条件判断语句。需要配合WHEN、THEN和END CASE使用

    CASE语句有两种语法格式:

    CASE
    	WHEN expr_condition THEN ...do something...
    	WHEN expr_condition THEN ...do something...
    	....多个 WHEN THEN 语句.....
            [ELSE ...do something...]
    END CASE;

    其中expr_condition为条件表达式,计算结果为true,则执行THEN后面的语句。多个WHEN...THEN依次执行,ELSE为可选条件。

    另外一种语法格式:

    CASE case_expr
    	WHEN expr THEN .....do something....
    	WHEN expr THEN .....do something...
    	....多个表达式...
    	[ELSE ...dosomething..]
    END CASE;

    其中,case_expr表示条件判断的表达式,WHEN后的表达式结果如果和case_expr匹配,则执行相应的THEN后面的语句。没有则执行ELSE,ELSE为可选。这种语法类似switch...case(建议使用第一种,逻辑清晰一点)。

    LOOP、REPEAT、WHILE、LEAVE和ITERATE

    其中LOOP、REPEAT和WHILE都是创建循环语句的关键词。

    LEAVE用来退出任何被标注的循环语句(类似break,只能用于循环语句)。

    ITERATE语句将执行顺序转到语句段开头处(类似continue,只能用于循环语句)。

    LOOP基本语法(需要配合 END LOOP):

    [loop_label]:LOOP
    	...do something....
    END LOOP [loop_label];

    其中,loop_label为可选,表示LOOP体的标签,do something为循环体。

    LOOP简单示例(配合LEAVE和ITERATE):

    DECLARE id INT DEFAULT 0;
    add_loop:LOOP
    	SET id = id + 1;
    	IF(id>10) THEN
    		LEAVE add_loop;
    	ELSE
    		ITERATE add_loop;
    	END IF;
    END LOOP add_loop;

    REPEAT基本语法(需要配合 UNTIL和END REPEAT):

    [repeat_label:] REPEAT
    	....do something....
    UNTIL expr_condition;
    END REPEAT [repeat_label];

    其中,repeat_label为可选,表示REPEAT循环语句的标签,UNTIL指定循环条件。REPEAT执行过程是,每次循环体执行完毕需要去判断一下条件表达式expr_condition,如果为true继续执行,否则结束循环。

    WHILE基本语法(需要配合DO和END WHILE使用):

    [while_lebel:] WHILE expr_condition DO
    	.....do something....
    END WHILE [while_label];

    其中,while_label为可选,表示WHILE循环语句的标签。WHILE的执行过程是,先判断条件表达式expr_condition,如果为true执行循环,否则结束循环(与REPEAT的区别是:WHILE先判断条件,REPEAT是后判断条件)。

    调用存储过程

    基本语法:

    CALL sp_name([params,...]);

    说明:如果存储过程没有参数,不能省略括号;参数个数要与存储过程定义的入参和出参个数匹配,用逗号隔开;出参类型的参数需要加上@符号。

    调用存储函数

    基本语法:

    SELECT func_name([params...]);

    说明:如果存储函数没有参数,不能省略括号;因为存储函数都是入参,所以只需注意匹配个数即可。

    查看存储过程和存储函数

    基本语法:

    SHOW [PROCEDURE | FUNCTION] STATUS [LIKE 'pattern'];

    说明:查看存储过程即PROCEDURE、存储函数即FUNCTION。LIKE为过滤条件(按存储过程、函数名字匹配),如果没有则是查看所有定义。

    SHOW [CREATE | PROCEDURE] FUNCTION sp_name;

    此语句查看定义存储函数、存储过程的脚本。

    删除存储过程、存储函数

    基本语法:

    DROP [PROCEDURE | FUNCTION] [IF EXISTS] sp_name;

    说明:sp_name为存储过程或存储函数的全称。[IF EXISTS]是mysql的一个扩展,建议使用。如果存储过程或函数不存在,它可以防止错误的产生,但是会产生一个用SHOW WARNINGS查看的警告。

    修改存储过程、存储函数

    注意:只能修改存储过程或函数的定义,不能修改执行的逻辑代码或参数

    基本语法:

    ALTER [PROCEDURE | FUNCTION] sp_name [characteristic.....];

    其中,sp_name为存储过程或函数的名称,characteristic指定存储过程的特性。可以修改的特性和定义存储过程的时候的可选特性是一样的,不重复累赘


    总结

    1、存储过程和存储函数的区别(除了关键字:PROCEDURE、FUNCTION)

    本质上都是存储程序。

    参数类型不同:存储函数不允许声明出参类型,只能通过return关键字返回;

    调用方式不同:存储过程用CALL,存储函数用SELECT;

    存储函数限制比较多,多以建议使用存储过程,慎用存储函数。

    2、修改存储过程、存储函数

    存储过程或存储函数中的代码是不提供修改的,只能通过drop删除后,重新编写,或者直接编写一个新的程序。只能修改存储过程或存储函数的特性。

    3、存储过程和存储函数可以相互调用

    存储过程和存储函数包含自定义的SQL语句集合,所以,可以使用CALL或SELECT调用其它存储过程和存储函数。但是不能使用DROP删除其它存储过程和存储函数。

    4、注意区别参数名字和表中的字段名

    在定义存储过程和存储函数的时候,参数名称一定要与表中的字段名区别开来,否则可能出现无法预期的结果。

     

    展开全文
  • MySQL存储函数和存储过程的区别

    千次阅读 2017-11-22 13:53:08
    存储过程与存储函数的区别 1:存储函数和存储过程统称为存储例程(store routine),存储函数的限制比较多,例如不能用临时表,只能用表变量,而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性...
  • 一,朋友创建存储函数报错。CREATE DEFINER=`root`@`localhost` FUNCTION `stuff`( f_old varchar(1000),f_start int,f_length int,f_replace varchar(1000) ) RETURNS varchar(2000) CHARSET utf8 BEGIN return ...
  • 最近写一些mysql存储过程和函数,发现网上比较有价值的文档很少,大都是照着手册上抄来的,有些实际问题解决不了,比如用变量作表名。 经过反复调试,总算找到解决办法,一下是一些简单的记录,比较零碎。部分内容...
  • mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+--------...
  • MySQL调用存储过程和函数

    千次阅读 2019-09-01 15:00:27
    存储过程和函数有多种调用方法。...存储函数的调用与MySQL中预定义的函数的调用方式相同。 1.调用存储过程 存储过程是通过call 语句进行调用的,语法如下: call sp_name([parameter[,...]) call语句调用一...
  • mySql实现树形查询的函数存储过程例子
  • 什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法; ps:存储过程跟触发器有点类似,都是一组...MySQL存储过程的创建 语法 CREATE PROCEDURE sp_name (
  • MySQL存储过程与存储函数的区别

    千次阅读 2018-01-26 11:11:51
    一.MySQL存储过程与存储函数的区别 https://www.cnblogs.com/rogge7/p/5300605.html 语法定义上的区别就不说了,说一下其他的。如果有不正确的地方,还请大家指正。 1、总述 存储函数和存储过程统称为...
  • mysql存储过程和存储函数练习题

    千次阅读 2020-05-28 09:12:28
    课题 实验五 存储过程和存储函数 目的要求 1. 掌握通过SQL语句CREATE PROCEDURE创建存储过程的方法。 2. 掌握使用SQL语句CALL调用存储过程的方法。 3. 掌握使用SQL语句ALTER PROCEDURE修改存储过程的方法。 4. 掌握...
  • mysql 存储过程/函数调试

    千次阅读 2019-07-03 11:10:44
    对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那么如果能找到一个比较好的调试工具,就可以事半功倍, 这里介绍的是dbForge Studio for MySQL。 工具官网地址:...
  • 创建存储函数的语法结构: CREATE FUNCTION func_name([proc_parameter])RETURN type[characteristics…] routine body 语法结构释义: CREATE FUNCTION:创建关键字func_name:存储函数名称proc_parameter:参数...
  • ###创建一个存储函数 (插入1000条数据) DROP PROCEDURE IF EXISTS proc_initData; DELIMITER $ CREATE PROCEDURE proc_initData() BEGIN DECLARE i INT DEFAULT 1; DECLARE n VARCHAR(64) DEFAULT '语音助手'; ...
  • 本文主要讲解了关于MySQL存储函数(自定义函数)的定义和使用方法详解与存储函数与存储过程的区别
  • mysql 创建存储过程及函数

    千次阅读 2020-04-18 20:29:29
    1. 存储过程 1.1. 基本语法 create procedure name ([params]) UNSIGNED [characteristics] routine_body params : in|out|inout 指定参数列表 代表输入与输出 routine_body: SQL代码内容,以begin ..........
  • MySQL存储过程和存储函数(看不懂你打我系列)

    千次阅读 多人点赞 2020-05-24 08:20:25
    MySQL存储过程和存储函数 MySQL中提供存储过程与存储函数机制,我们先将其统称为存储程序,一般的SQL语句需要先编译然后执行,存储程序是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,当用户通过指定...
  • 本篇文章是对mysql创建自定义函数存储过程进行了详细的分析介绍,需要的朋友参考下
  • 主要为大家详细介绍了MySQL存储过程和函数的操作第十二篇,感兴趣的小伙伴们可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,503
精华内容 92,601
关键字:

mysql存储函数

mysql 订阅