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='', 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()

原理图

第二百八十三节,MySQL数据库-MySQL存储过程的更多相关文章

  1. 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)

    MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...

  2. 第二百八十五节,MySQL数据库-MySQL函数

    MySQL数据库-MySQL函数 1.MySQL内置函数 SELECT执行函数,后面跟要执行的函数 CHAR_LENGTH(str)函数:返回字符串的字符长度 -- CHAR_LENGTH(str)函 ...

  3. 第二百八十四节,MySQL数据库-MySQL触发器

    MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...

  4. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  5. 第三百八十三节,Django+Xadmin打造上线标准的在线教育平台—第三方模块django-simple-captcha验证码

    第三百八十三节,Django+Xadmin打造上线标准的在线教育平台—第三方模块django-simple-captcha验证码 下载地址:https://github.com/mbi/django- ...

  6. 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询

    MySQL数据库-索引.limit分页.执行计划.慢日志查询 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获 ...

  7. 第二百八十节,MySQL数据库-外键链表之一对多,多对多

    MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

  8. 第二百七十九节,MySQL数据库-pymysql模块操作数据库

    MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...

  9. 第二百七十五节,MySQL数据库安装和介绍

    MySQL数据库安装 一.概述 1.什么是数据库 ? 答:数据的仓库,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一种 ...

随机推荐

  1. datagrid,treegrid携带参数刷新示例

    datagrid携带参数刷新: var queryParams = $("#datagridId").datagrid("options").queryPara ...

  2. 在 Windows 8 中启用可匿名访问的共享

    就是不用输入用户名和密码,直接通过网上邻居可以访问的共享. 1.打开本地组策略编辑器(快捷键Win+R,打开运行,输入gpedit.msc,确定): 2.打开:"本地计算机策略->计算 ...

  3. 【转】SQL SERVER函数无法执行对数据库的修改语句

    当在函数中使用INSERT语句时出现以下错误: 消息 443,级别 16,状态 15,过程 MyTestFunction,第 9 行 在函数内的 'INSERT' 中对带副作用的或依赖于时间的运算符的 ...

  4. [hihoCoder] #1158 : 质数相关

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中 ...

  5. Javascript玩转继承(三)

    在前两篇文章中,介绍了构造继承和原型继承.今天把剩下的两种写完,这两种的应用相对于前两种来说应用很少,因此称为是非主流继承方式. 首先,来看非主流继承一:实例继承法.我也不说那么多废话了,既然是非主流 ...

  6. 学习笔记之gethostbyaddr函数

    刚才学了gethostbyname函数,这个gethostbyaddr函数的作用是通过一个IPv4的地址来获取主机信息,并放在hostent结构体中. #include <netdb.h> ...

  7. 盗取cookie终极代码

    大家知道xss攻击最有效的方式就是盗取cookie值.通过盗取cookie值可以进入后台从法客搬过来的~ JS: document.write('<script LANGUAGE="J ...

  8. cocos2d-x Schedule详解

    原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止. Coc ...

  9. npm 的指令介绍

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  10. Java日志 (zhuan)

    http://www.cnblogs.com/bird-li/p/4696662.html ************************************************* 日志对于 ...