mysql_存储过程

来源:互联网 发布:java抓取网页数据 编辑:程序博客网 时间:2024/06/06 17:21

一、存储过程:存储过程就是带有逻辑性的sql语句;

          之前的SQL语句是没有条件判断,没有循环。

存储过程是有流程控制语句:IF语句、WHILE语句

存储过程的特点:

   1.执行效率比较高 并且存储过程是在数据库的服务器放进行执行

   2.缺点:移植性比较差,不同的数据库服务器之间的存储过程不能相互进行转移

二、定义存储过程

  --  查询所有的员工信息

  DELIMITER $  -- 声明存储过的结束符

  CREATE  PROCEDURE  pro_test1()  -- pro_test1 代表的是存储过程名

   BEGIN

    SELECT * FROM  emp ;-- sql语句 +流程控制语句

   END $;

三、调用存储过程

  CALL  存储过程名;

四、参数  

   IN::表示的是输入参数,可以携带数据进入到存储过程。

   OUT:表示的书输出参数,可以从存储过程中进行返回结果。

   INOUT:既表示输入也表示输出,既有输入的功能也有输出的功能。

五、Mysql服务器中的变量

 存储过程是如何接受返回值?

   mysql服务器当中变量分为三类

   1.全局变量:(又称内置变量) mysql数据库内置的变量

       查看所有的全局变量:SHOW VARIABLES;

       部分变量的问题:

       character_set_clientmysql服务器端接收数据的编码

       character_set_resultsmysl服务器输出数据的编码

       -- 修改全局变量的值

       SET 变量名=新值;

       -- 查看某一个全局变量的值

       SELECT @@变量名

       SELECT @@character_set_client;

  2.局部变量:定义在一个存储过程当中的变量,局部变量的使用范围只在当前的存储过程

    当中。

  3.会话变量:值存在于当前的客户端与数据服务端之间的一次连接当中,如果断开连接,

    这会话变量数据全部丢失。

    ①定义会话变量

      SET @变量名=;

    ②查询会话变量

      SELECT @变量名;

六、例子

CREATE  TABLE  emp(

 id  INT PRIMARY  KEY,

 NAME  VARCHAR(20),

 sex  VARCHAR (2)

);

INSERT  INTO emp  (id,NAME,sex) VALUES(1,'张三1','1');

INSERT  INTO emp  (id,NAME,sex) VALUES(2,'张三2','2');

INSERT  INTO emp  (id,NAME,sex) VALUES(3,'张三3','3');

INSERT  INTO emp  (id,NAME,sex) VALUES(4,'张三4','4');

SELECT * FROM  emp;

-- 1.定义一个存储过程:查询所有的员工信息

DELIMITER $  

CREATE PROCEDURE pro_test1()

  BEGIN

  SELECT * FROM emp;

  END $;

-- 执行存储过程

CALL  存储过程名;

CALL  pro_test1();

-- 2.定义一个带有输入的存储过程:查询id为多少的员工信息

DELIMITER $

CREATE PROCEDURE pro_test2(IN eid INT)

  BEGIN

  SELECT * FROM emp WHERE id=eid;

  END $;

-- 执行存储过程

CALL pro_test2(2);

-- 3.定义一个带有输出的存储过程

DELIMITER $

CREATE PROCEDURE pro_test3(OUT str VARCHAR(20))

  BEGIN

  SET str='你好,欢迎来到石家庄';

  END $;

-- 执行存储过程,定义会话变量

-- 方法一

SET @a=1;

CALL pro_test3(@a);

SELECT @a;

-- 方法二

CALL pro_test3(@aa);

SELECT @aa;

-- 4.带有输入和输出参数的存储过程

DELIMITER $

CREATE  PROCEDURE por_test4(INOUT  i  INT)

 BEGIN

   SELECT   i;

   SET i=500;

 END $  

 

SET @n=10;

CALL por_test4(@n);

 

SELECT @n;

-- 5.根据员工编号 查询员工的姓名

-- 第一种方式

DELIMITER $

CREATE PROCEDURE pro_test5(IN eid INT,OUT str VARCHAR(20))

BEGIN

-- 用关键字INTO将查询结果name赋给变量str

SELECT NAME INTO str FROM emp WHERE id=eid;

END $;

 

SELECT * FROM emp;

CALL pro_test5(1,@na);

SELECT @na;

-- 第二种方式

DELIMITER $

CREATE PROCEDURE pro_test6(IN eid INT,OUT str VARCHAR(20))

BEGIN

SELECT NAME INTO str FROM emp WHERE id=eid;

SELECT  str;

END $;

 

SELECT * FROM emp;

CALL pro_test6(1,@na);

-- 6.带有逻辑的存储过程

-- 输出一个数字,判断判断你输入的数字是礼拜几

DELIMITER $

CREATE  PROCEDURE pro_test7(IN num INT, OUT str VARCHAR(20))

  BEGIN

   IF num=1 THEN

SET str='今天是礼拜一';

   ELSEIF num=2 THEN

SET str='今天是礼拜二';

    ELSEIF num=3 THEN

SET str='礼拜三';

   ELSE

SET str='你输入的有无';

   END IF;

  END $;

-- 执行sql语句

CALL pro_test7(1,@st);

SELECT @st;

 

-- 7.while 带有循环的存储过程

-- 输出一个整数 然后计算从0到这个整数之间所有整数的和  100  统计  0-100之间和

DELIMITER $

CREATE PROCEDURE pro_test8(IN num INT, OUT result INT)

 BEGIN

  -- 定义语句变量

   DECLARE i INT DEFAULT  0;  -- 定义一个参考量

   DECLARE sum1 INT DEFAULT 0;-- 用来接收每一个数的和、

   WHILE i<=num DO

   SET  sum1=sum1+i;

   SET i=i+1;

   END WHILE;

   -- result进行赋值

   SET result=sum1;

 END $;

 

CALL pro_test8(10,@n);

SELECT @n;

原创粉丝点击