MySQL进阶(一)存储过程

存储过程是数据库对象之一,存储过程可以理解成数据库的子程序,在客户端和服务器端可以直接调用它

在一般的关系型数据库中,可以在数据库中定义子程序,这种程序块称为存储过程(procedure)。它存放在数据字典中,可以在不同用户和应用程序直接共享,并可实现程序的优化和重用。使用存储过程的有点如下:

  • 过程在服务器端运行,执行速度快
  • 过程执行一次后代码就驻留在高速缓冲存储器,在以后的操作中,在以后的操作中只需从高速缓冲存储器中调用已编译代码执行,提搞了系统性能。
  • 确保数据库安全。可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问这些表的过程。非表的授权用户除非通过过程,否则就不能访问这些表。
  • 自动完成需要预先执行的任务。过程可以在系统自动启动时自动执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。
存储过程的创建和执行

语法格式:

CREATE 
    [DEFINER = { user | CURRENT_USER }] /* s授权用户*/
PROCEDURE procedure_name ([proc_parameter[,...]])  /* 定义过程名字和参数*/
    BEGIN
			sql_statement   /*定义过程体*/
		END

创建用户表:

DROP TABLE IF EXISTS `myuser`;
CREATE TABLE `myuser` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `age` tinyint(4) DEFAULT NULL,
  `sex` varchar(10) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

创建用过id查找用户姓名过程:

CREATE PROCEDURE by_id_select_username(IN user_id INTEGER)
BEGIN
SELECT username FROM myuser
WHERE id=user_id;
END

查看创建的存储过程:

SHOW PROCEDURE STATUS;

在这里插入图片描述

执行创建过程:

CALL by_id_select_username(1);
存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

PROCEDURE procedure_name ([[IN |OUT |INOUT ] param_name param_type...])
IN参数
DELIMITER $$
CREATE PROCEDURE cou_total(IN num INT)
BEGIN
  DECLARE n INT DEFAULT 0;
  DECLARE total INT DEFAULT 0;
  WHILE n<=num DO
    SET total := n + total;
    SET n := n+1;
  END WHILE;
  SELECT total, n;
END$$

CALL cou_total(10);

调用结果如下:
在这里插入图片描述

out参数

统计用户数量然后将结果传出:

DELIMITER $$

CREATE PROCEDURE user_count(out cou INT)
BEGIN
	SELECT COUNT(*) INTO cou
	FROM myuser;
END

DELIMITER ;

set @cou=1; /*定义变量和初始化*/

SELECT @cou; /*此处输出1*/

call user_count(@cou);  /*调用存储过程*/

select @cou; /*此处输出用户数量*/

inout参数
DELIMITER $$
CREATE PROCEDURE user_count_(INOUT num INT)
BEGIN
  DECLARE total INT(11);
  IF num = 10 THEN
     SET total := num+1;
  ELSE 
     SET total := num+2;
  END IF;
  SET num = total;  /*返回结果*/
END $$

DELIMITER;

SET @num=10;

SELECT @num;

CALL user_count_(@num);

SELECT @num;

删除存储过程:

DROP PROCEDURE procedure_name;

参考链接:
存储过程参数的具体详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值