第二百八十三节,MySQL数据库-MySQL存储过程

MySQL数据库-MySQL存储过程

MySQL存储过程,也就是有点像MySQL函数,但是他与MySQL函数是有区别的,后面会讲到函数,所以注意区分

注意:函数与存储过程的区别

存储过程是:CREATE PROCEDURE 创建的

函数时:create function 创建的

存储过程是:CALL  执行的

函数时:SELECT 执行的

函数里:不支持SQL语句【重点】

存储过程里:支持SQL语句【重点】

 

 

1、创建存储过程(函数)无参

delimiter设置数据库语句结束符,默认是遇到;表示语句结束,delimiter可以自定义语句结束符,后面跟结束符
create procedure创建存储过程(函数),后面跟、函数名称()
BEGIN表示SQL语句开始,后面跟SQL语句
END表示SQL语句结束

举例:有这样一张表

创建一个usr_nl_20 ()函数,功能是查询usr表nl字段等于20的数据

-- delimiter设置数据库语句结束符,默认是遇到;表示语句结束,delimiter可以自定义语句结束符,后面跟结束符
-- create procedure创建存储过程(函数),后面跟、函数名称()
-- BEGIN表示SQL语句开始,后面跟SQL语句
-- END表示SQL语句结束

-- 格式:
-- delimiter $$                                        -- 将语句结束符改为$$
-- create procedure 函数名称()
-- BEGIN                                                    -- SQL语句开始
--     SQL语句
-- END $$                                                    -- SQL语句开始
-- delimiter ;                                        -- 将语句结束符改为默认

delimiter $$
CREATE PROCEDURE usr_nl_20 ()
BEGIN
    SELECT
        id,
        yhm,
        xb,
        nl
    FROM
        usr
    WHERE
        nl = 20 ;
END $$
delimiter ;

 

 

 

2、执行存储过程(函数)

call执行存储过程(函数),后面跟、函数名称()

-- call执行存储过程(函数),后面跟、函数名称()
CALL usr_nl_20();

 

 

3、删除存储过程(函数)

DROP PROCEDURE删除存储过程(函数),后面跟要删除的函数名称

-- DROP PROCEDURE删除存储过程(函数),后面跟要删除的函数名称
DROP PROCEDURE usr_nl_20;

 

 

 

4、修改存储过程(函数)

一般函数都不用修改的办法,一般都是删除后重写

DROP PROCEDURE删除存储过程(函数),后面跟要删除的函数名称
if EXISTS判断后面的变量或者函数是否存在,如果存在执行if EXISTS前面的语句

-- DROP PROCEDURE删除存储过程(函数),后面跟要删除的函数名称
-- if EXISTS判断后面的变量或者函数是否存在,如果存在执行if EXISTS前面的语句

DROP PROCEDURE if EXISTS usr_nl_20;        -- 判断usr_nl_20函数是否存在,如果存在删除函数,如果不存在则不删除
-- 如果存在函数删除后创建函数,不存在创建函数
delimiter $$
CREATE PROCEDURE usr_nl_20 ()
BEGIN
    SELECT
        id,
        yhm,
        xb,
        nl
    FROM
        usr
    WHERE
        nl = 20 ;
END $$
delimiter ;

 

 

 

5、创建存储过程(函数)有参,in 仅用于传入参数用

对于存储过程,可以接收参数,其形式参数有三种用途类型:
  in 仅用于传入参数用
  out 仅用于返回值用
  inout 既可以传入又可以当作返回值

DECLARE定义变量
DEFAULT设置变量的默认值
SET给变量赋值 要赋值的变量 值
定义变量的方式:DECLARE  变量名称  指定变量接收的数据类型  DEFAULT  设置变量的默认值

DROP PROCEDURE if EXISTS usr_nl_20;        -- 判断usr_nl_20函数是否存在,如果存在删除函数,如果不存在则不删除
-- 如果存在函数删除后创建函数,不存在创建函数

-- 对于存储过程,可以接收参数,其形式参数有三种用途类型:
--   in 仅用于传入参数用
--   out 仅用于返回值用
--   inout 既可以传入又可以当作返回值
-- 
-- 
-- DECLARE定义变量
-- DEFAULT设置变量的默认值
-- SET给变量赋值 要赋值的变量 值
-- 定义变量的方式:DECLARE  变量名称  指定变量接收的数据类型  DEFAULT  设置变量的默认值


delimiter $$
CREATE PROCEDURE usr_nl_20 (
    in canshu int
)
BEGIN
    DECLARE d1 int;
    DECLARE d2 int DEFAULT 3;
    SET d1 = canshu + d2;

    SELECT id,yhm,xb,nl FROM usr WHERE id > d1;
END $$
delimiter ;

运行有参函数

-- 运行有参函数
CALL usr_nl_20(1);

 

 

 

6、创建存储过程(函数)有参,in 仅用于传入参数用,out 仅用于返回值用

delimiter $$
DROP PROCEDURE if EXISTS usr_nl_20;
CREATE PROCEDURE usr_nl_20 (
    in canshu int,  -- in 仅用于传入参数用
    OUT canshu2 INT  -- out 仅用于返回值用
)
BEGIN
    DECLARE d2 INT DEFAULT 3;  -- 设置变量d2等于3
    IF canshu = 1 THEN  -- 判断传入参数如果等于1
        SET canshu2 = 100 + d2;  -- 赋值返回参数等于100加d2
    ELSEIF canshu = 2 THEN  -- 判断传入参数等于2
        SET canshu2 = 200 + d2;  -- 返回参数等于200+d2
    ELSE  -- 否则
        SET canshu2 = 1000 + d2;  -- 返回参数等于1000+d2
    END IF;
END $$
delimiter ;

执行函数

执行函数,传入参数,和传入引用参数,也就是返回值参数

@定义引用参数,也就是返回值参数

-- 执行函数,传入参数,和传入引用参数,也就是返回值参数
-- @定义引用参数,也就是返回值参数
CALL usr_nl_20(1, @u);
SELECT @u;    

 

 

 

7、创建存储过程(函数)有参,in 仅用于传入参数用,out 仅用于返回值用,inout 既可以传入又可以当作返回值

delimiter $$
DROP PROCEDURE if EXISTS usr_nl_20;
CREATE PROCEDURE usr_nl_20 (
    in canshu int,  -- in 仅用于传入参数用
    OUT canshu2 INT,  -- out 仅用于返回值用
    INOUT ii INT  -- inout 既可以传入又可以当作返回值
)
BEGIN
    DECLARE d2 INT DEFAULT 3;  -- 设置变量d2等于3
        SET ii = ii + 1;
    IF canshu = 1 THEN  -- 判断传入参数如果等于1
        SET canshu2 = 100 + d2;  -- 赋值返回参数等于100加d2
    ELSEIF canshu = 2 THEN  -- 判断传入参数等于2
        SET canshu2 = 200 + d2;  -- 返回参数等于200+d2
    ELSE  -- 否则
        SET canshu2 = 1000 + d2;  -- 返回参数等于1000+d2
    END IF;
END $$
delimiter ;

执行函数

SET @f = 5;  -- 定义inout类型变,可传入可返回变量
CALL usr_nl_20(1, @u, @f);  -- 执行函数,参数in 仅用于传入参数用,参数out 仅用于返回值用,参数inout 既可以传入又可以当作返回值
SELECT @u,@f;  -- 查看两个类型的返回值

 

 

8、pymysql模块,执行存储过程(函数),获取SQL语句查询结果、和返回值

举例:创建了一个存储过程(函数)有参,函数里既有返回值、又有SQL语句查询结果,怎么通过pymysql模块既拿到返回结果,又拿到SQL语句查询结果

执行存储过程(函数)

delimiter $$
DROP PROCEDURE if EXISTS usr_nl_20;
CREATE PROCEDURE usr_nl_20 (
    in canshu int,  -- in 仅用于传入参数用
    OUT canshu2 INT,  -- out 仅用于返回值用
    INOUT ii INT  -- inout 既可以传入又可以当作返回值
)
BEGIN
    DECLARE d2 INT DEFAULT 3;  -- 设置变量d2等于3
        SET ii = ii + 1;
        SELECT * FROM usr; -- SQL查询语句
    IF canshu = 1 THEN  -- 判断传入参数如果等于1
        SET canshu2 = 100 + d2;  -- 赋值返回参数等于100加d2
    ELSEIF canshu = 2 THEN  -- 判断传入参数等于2
        SET canshu2 = 200 + d2;  -- 返回参数等于200+d2
    ELSE  -- 否则
        SET canshu2 = 1000 + d2;  -- 返回参数等于1000+d2
    END IF;
END $$
delimiter ;

 

pymysql模块,执行存储过程(函数),获取SQL语句查询结果、和返回值

callproc()执行存储过程(函数),两个参数
使用方式:
游标变量.callproc('存储过程(函数)名称',(函数参数多个参数,号隔开))

 

fetchall()获取存储过程(函数)里的SQL语句查询结果
使用方式:
游标变量.fetchall()

 

execute()获取存储过程(函数)的返回值,参数是要获取返回值的形式参数索引
使用方式:
游标变量.execute("select @_存储过程(函数)名称_0,@_存储过程(函数)名称_1,@_存储过程(函数)名称_2")

 

fetchone()拿到存储过程(函数)的返回值
使用方式:
游标变量.fetchone()

#!/usr/bin/env python
#coding:utf-8

import tornado.ioloop
import tornado.web                                              #导入tornado模块下的web文件
import pymysql                                                  #导入数据库模块

class khdHandler(tornado.web.RequestHandler):
    def get(self):

        #连接数据库
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='279819', db='cshi',charset='utf8')
        # 创建游标
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)


        #执行存储过程(函数)
        row = cursor.callproc('usr_nl_20',(1,2,3))


        #获取存储过程(函数)里的SQL语句查询结果
        chaxjieg = cursor.fetchall()
        print(chaxjieg) #打印SQL语句查询结果

        #获取存储过程(函数)的返回值
        effect_row = cursor.execute("select @_usr_nl_20_0,@_usr_nl_20_1,@_usr_nl_20_2")
        fhuizhi = cursor.fetchone()
        print(fhuizhi)


        # 提交,不然无法保存新建或者修改的数据
        # conn.commit()

        # 关闭游标
        cursor.close()
        # 关闭连接
        conn.close()

        self.write("欢迎访问")


settings = {                                            #html文件归类配置,设置一个字典
    "template_path":"views",                            #键为template_path固定的,值为要存放HTML的文件夹名称
    "static_path":"statics",                            #键为static_path固定的,值为要存放js和css的文件夹名称
}

#路由映射
application = tornado.web.Application([                 #创建一个变量等于tornado.web下的Application方法
    (r"/khd", khdHandler),
],**settings)                                           #将html文件归类配置字典,写在路由映射的第二个参数里

if __name__ == "__main__":
    #内部socket运行起来
    application.listen(8002)                            #设置端口
    tornado.ioloop.IOLoop.instance().start()

原理图

 

posted @ 2017-06-12 18:21  林贵秀  阅读(334)  评论(0编辑  收藏  举报