mysql 5.5 存储过程_MySQL 5.5 创建存储过程和函数

MySQL 5.5 创建存储过程和函数

发布时间:2020-08-09 08:51:34

来源:ITPUB博客

阅读:58

作者:feelpurple

执行CREATE PROCEDURE和CREATE FUNCTION语句需要CREATE ROUTINE权限。

查看neo用户现有权限

ab97d35329cb930215aa1cee3e637828.png

授权

mysql> grant create routine on fire.* to neo;

Query OK, 0 rows affected (0.12 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.02 sec)

创建存储过程

9410563fbf7f5061a8df8c4e69ea6348.png

注意:在命令行缩进时,不要用tab,要使用空格,否则会报下面的错

DATE INNER MULTILINESTRING SET UNICODE warnings

DATEDIFF INNOBASE MULTILINESTRINGFROMTEXT SHA UNION

DATETIME INNODB MULTILINESTRINGFROMWKB SHA1 UNIQUE

DATE_ADD INOUT MULTIPOINT SHARE UNIQUE_USERS

-> Info;

->

Display all 903 possibilities? (y or n)

执行存储过程

286c3045f5831ad165b843bccdbd8765.png

授权

mysql> grant execute on fire.* to neo;

Query OK, 0 rows affected (0.04 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

0cb4fbf612e27eb00d8c7c4b2b1a57b7.png

22f1712e9463782831068b46f24515fd.png

也可以直接在Navicat里面执行

fce2894c55a1d5c4d46bddc6e24b9e2b.png

编辑存储过程

9ef462441d39b2930e18f3eb5b391e06.png

调用存储过程

a6981a6a9b8489283440786f24c938b5.png

d860f7d831fff8872d561cc56938030a.png

创建不含参数的存储过程,和Oracle不同的是,存储过程名字后面必须要有()

mysql> delimiter $$

mysql> create procedure proc_Subscribers_update()

-> begin

-> DECLARE v_count INT;

-> select ifnull(max(a),0) into v_count from t2;

-> while v_count < 2 do

-> select concat('the maximum value is ',v_count);

-> set v_count = v_count+1;

-> end while;

-> end$$

Query OK, 0 rows affected (0.06 sec)

创建包含传入参数的存储过程

delimiter $$

create procedure proc_Subscribers_update(IN v_fetch_cnt INT, IN v_sleep_secs INT)

begin

DECLARE v_count INT;

DECLARE v_times INT DEFAULT 1;

DECLARE v_max_value INT;

/*compute the times that the loop runs*/

select ceil(count(MSISDN))/v_fetch_cnt into v_count from tmp_Subscribers_01;

/*compute the maximum rows that have been already updated*/

WHILE v_times < v_count DO

select ifnull(max(id),0) into v_max_value from tmp_Subscribers_02;

if v_max_value < v_fetch_cnt * v_count then

SET v_times = 1 + floor(v_max_value/v_fetch_cnt);

update Subscribers s,tmp_Subscribers_01 t set s.LastAccessTimeStamp=1420066800

where s.MSISDN=t.MSISDN and t.id > v_max_value and t.id <= v_fetch_cnt * v_times;

/*record the processing rows*/

insert into tmp_Subscribers_02 select id, MSISDN, now() from tmp_Subscribers_01 where id = v_fetch_cnt * v_times;

select concat('The job',' has already updated ', v_fetch_cnt * v_times, ' rows..') as Info;

select sleep(v_sleep_secs);

end if;

commit;

END WHILE;

select concat('The job',' is ','finished!') as Info;

commit;

end$$

删除存储过程

1698bb5c9050c5f5b8f8a1f298cbe31d.png

需要授予alter routine权限

mysql> grant alter routine on fire.* to neo;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

7fa3d8a2588d99bcb240c358d35a1706.png

在mysql客户端中创建调用存储过程

MariaDB [test]> delimiter //

MariaDB [test]> create procedure simpleproc(out param1 int)

-> begin

-> select count(*) into param1 from t;

-> end//

Query OK, 0 rows affected (0.12 sec)

MariaDB [test]> delimiter ;

MariaDB [test]> CALL simpleproc(@a);

Query OK, 1 row affected (0.08 sec)

MariaDB [test]> select @a;

+------+

| @a   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)

在调用的时候,如果参数不带@,会报下面的错

mysql> call proc_test(a,b);

ERROR 1414 (42000): OUT or INOUT argument 1 for routine test.proc_test is not a variable or NEW pseudo-variable in BEFORE trigger

查看存储过程的状态

MariaDB [test]> show procedure status like 'simpleproc'\G

*************************** 1. row ***************************

Db: test

Name: simpleproc

Type: PROCEDURE

Definer: root@localhost

Modified: 2016-07-01 08:16:20

Created: 2016-07-01 08:16:20

Security_type: DEFINER

Comment:

character_set_client: utf8

collation_connection: utf8_general_ci

Database Collation: utf8_general_ci

1 row in set (0.00 sec)

通过information_schema的视图查看存储过程的相关信息

MariaDB [test]> select * from information_schema.routines where routine_name='simpleproc'\G

*************************** 1. row ***************************

SPECIFIC_NAME: simpleproc

ROUTINE_CATALOG: def

ROUTINE_SCHEMA: test

ROUTINE_NAME: simpleproc

ROUTINE_TYPE: PROCEDURE

DATA_TYPE:

CHARACTER_MAXIMUM_LENGTH: NULL

CHARACTER_OCTET_LENGTH: NULL

NUMERIC_PRECISION: NULL

NUMERIC_SCALE: NULL

DATETIME_PRECISION: NULL

CHARACTER_SET_NAME: NULL

COLLATION_NAME: NULL

DTD_IDENTIFIER: NULL

ROUTINE_BODY: SQL

ROUTINE_DEFINITION: begin

select count(*) into param1 from t;

end

EXTERNAL_NAME: NULL

EXTERNAL_LANGUAGE: NULL

PARAMETER_STYLE: SQL

IS_DETERMINISTIC: NO

SQL_DATA_ACCESS: CONTAINS SQL

SQL_PATH: NULL

SECURITY_TYPE: DEFINER

CREATED: 2016-07-01 08:16:20

LAST_ALTERED: 2016-07-01 08:16:20

SQL_MODE: NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

ROUTINE_COMMENT:

DEFINER: root@localhost

CHARACTER_SET_CLIENT: utf8

COLLATION_CONNECTION: utf8_general_ci

DATABASE_COLLATION: utf8_general_ci

1 row in set (0.00 sec)

查看存储过程的定义

MariaDB [test]> show create procedure simpleproc\G

*************************** 1. row ***************************

Procedure: simpleproc

sql_mode: NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleproc`(out param1 int)

begin

select count(*) into param1 from t;

end

character_set_client: utf8

collation_connection: utf8_general_ci

Database Collation: utf8_general_ci

1 row in set (0.00 sec)

创建函数

MySQL的传入参数不能设置默认值,否则会报错

mysql> delimiter $$

mysql> CREATE FUNCTION format_selectQuery (THE_TABLE_NAME VARCHAR(75), THE_COLUMNS_NAME VARCHAR(75), THE_CONDITION VARCHAR(75) DEFAULT NULL) RETURNS VARCHAR(200) DETERMINISTIC

-> BEGIN

->     /*SELECT concat(' WHERE ', THE_CONDITION) INTO @WHERE_CLAUSE;

/*>     IF THE_CONDITION IS NULL THEN

/*> SET @WHERE_CLAUSE = NULL;

/*> END IF;

/*>     RETURN concat('SELECT ', THE_COLUMNS_NAME, ' FROM ', THE_TABLE_NAME, @WHERE_CLAUSE);*/

->     RETURN 1;

-> END $$

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT '') RETURNS VARCHAR(200) DETERMINISTIC

BEGIN

RETURN 1;

END' at line 1

mysql> delimiter ;

需要注意的是,在MySQL里,创建函数中在函数声明后面的返回关键字是RETURNS

edb189807ecc39fa8f5d90b6f64fb327.png

执行函数

6009a0d2279155280dfac1ccc45598b7.png

6009a0d2279155280dfac1ccc45598b7.png

需要注意的是,函数或存储过程里面的参数声明顺序,顺序有误,容易引起语法报错

delimiter $$

CREATE FUNCTION is_ChangeDescColumnExist (THE_VERSION_LEVEL_TABLE_NAME VARCHAR(35)) RETURNS INT DETERMINISTIC

BEGIN

/* 声明变量*/

DECLARE nbr INT;

/* 声明异常*/

DECLARE CONTINUE HANDLER FOR NOT FOUND set nbr = 1;

/* 给变量赋值 */

SET nbr =0;

select count(*) into nbr from information_schema.columns where table_name = THE_VERSION_LEVEL_TABLE_NAME and

(column_name ='C_CHANGE_DESCRIPTION');

IF nbr = 1 THEN

RETURN 1;

ELSE

RETURN 0;

END IF;

END$$

delimiter ;

将上面的顺序放置错误,则会引起报错

mysql> CREATE FUNCTION is_ChangeDescColumnExist (THE_VERSION_LEVEL_TABLE_NAME VARCHAR(35)) RETURNS INT DETERMINISTIC

->     BEGIN

->     DECLARE nbr INT;

->     SET nbr =0;

->     DECLARE CONTINUE HANDLER FOR NOT FOUND set nbr = 10;

->

->         select count(*) into nbr from information_schema.columns where table_name = THE_VERSION_LEVEL_TABLE_NAME and

->         (column_name ='C_CHANGE_DESCRIPTION');

->         IF nbr = 1 THEN

->             RETURN 1;

->         ELSE

ELSE    ELSEIF

->         ELSE

->             RETURN 0;

->         END IF;

->     END$$

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE CONTINUE HANDLER FOR NOT FOUND set nbr = 10;

select c' at line 5

创建两个函数,返回两种变量,一种是DECLARE变量,一种是@变量

delimiter $$

CREATE FUNCTION is_TableMigrated (THE_VERSION_LEVEL_TABLE_NAME VARCHAR(20)) RETURNS INTEGER DETERMINISTIC

BEGIN

DECLARE nbr integer;

SET nbr =222;

RETURN nbr;

END$$

delimiter ;

delimiter $$

CREATE FUNCTION is_TableMigrated (THE_VERSION_LEVEL_TABLE_NAME VARCHAR(20)) RETURNS INTEGER DETERMINISTIC

BEGIN

DECLARE nbr integer;

SET @nbr2 =22222;

RETURN @nbr2;

END$$

delimiter ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值