文章目录

  • 1. 存储过程概述
  • 2. 创建存储过程 create procedure
    • 2.1. 参数 in、out、inout
  • 3. 调用存储过程 call
  • 4. 查看存储过程
    • 4.1. 查看存储过程的状态
    • 4.2. 查看存储过程的定义
    • 4.2. 从information_schema.Routines表查看存储过程的信息 mysql
  • 5. 修改存储过程 alter procedure
  • 6. 删除存储过程 drop procedure

1. 存储过程概述

存储过程是一种在数据库中存储复杂程序,以便外部程序调用的数据库对象。

存储过程经编译创建并保存在数据库中,用户可通过指定存储过程的名字和给定参数来调用执行。存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。

作个形象的比喻,存储过程也可以看作是一个"加工厂",它接收"原料"(in参数)然后将这些原料加工处理成"产品"(out/inout参数),再把"产品"交付给"调用者"。

存储过程的优点

  1. 减少网络流量的使用
  2. 将重复性很高的一系列操作,封装到一个存储过程中,简化了SQL的调用
  3. 批量处理: 通过循环减少流量,也就是“跑批”
  4. 统一接口,确保数据安全。

存储过程的缺点

  1. 存储过程往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  2. 存储过程的性能调校与撰写受限于具体的数据库系统。

2. 创建存储过程 create procedure

创建存储过程的语法如下:

create [definer = {user|current_user}] procedure [过程名] ( [参数1],[参数2],...,[参数n] )[[特征1],[特征2],...,[特征n]] [SQL代码];-- definer 用于指定存储过程由哪个用户定义,默认是当前用户,注意不是指定存储过程的使用权限-- [过程名] 该过程名用于指定存储过程,分别用户调用-- [参数] 参数的形式为:[in|out|inout] [参数名] [参数类型],例如:in pcd_id int、inout pcd_username varchar(3)
-- -- -- in 表示该参数为输入参数,即调用时传入
-- -- -- out 表示该参数为输出参数,即存储过程的返回值
-- -- -- inout 表示该参数即可输入也可输出
-- -- -- 参数类型 可以是 int或者varchar()-- [特征] 特征是存储过程的属性,它包括了如下几个可选特征
-- -- -- comment '' 注释信息,例如:commet '这是一个存储过程'
-- -- -- language sql 指定存储过程使用的语言为sql
-- -- -- [not] deterministic 是否指定一个输入仅对应一个输出(映射),包含下面2个可选参数
-- -- -- -- -- not deterministic(默认),表示不指定映射关系;
-- -- -- -- -- deterministic,表示指定映射关系
-- -- -- [contains sql | no sql | reads sql data | modifies sql data] 明确子程序对数据的操作,包含下面4个可选参数
-- -- -- -- -- contains sql(默认),表示子程序不包含读或者写数据的语句
-- -- -- -- -- no sql,表示子程序不包含sql
-- -- -- -- -- reads sql data,表示子程序包含读数据的语句,但是不包含写数据的语句
-- -- -- -- -- modifies sql data,表示子程序包含写数据的语句
-- -- -- sql security [definer|invoker] 指定调用权限,包含下面两个可选参数
-- -- -- -- -- sql security definer(默认),使用创建者权限调用存储过程,不受限制
-- -- -- -- -- sql security invoker,使用调用者权限调用存储过程,只有被赋予权限的调用者才能调用

例如:

-- 将tab_sale表中sale_name字段值等于传入参数的记录删除
create procedure delete_sale(in pcd_sale_name varchar(3))
begindelete from tab_tablewhere tab_table.sale_name= pcd_sale_name ;
end
2.1. 参数 in、out、inout

下面三段代码是对存储过程的参数in、out和inout的代码说明:

-- 创建一个存储过程,参数为in
create procedure test(in i int)
beginselect i; -- 返回结果i,i=1set i=2;select i; -- 返回结果i,i=2
end-- 调用存储过程test,并传入一个参数i=1
set @i = 1; -- 定义全局变量i
call test(@i);
select @i; -- 返回结果i,i=1-- 由以上代码可知当存储过程的参数为in时,会传入变量的值,并且存储过程内部的赋值不会影响到外部传入的变量
-- 创建一个存储过程,参数为out
create procedure test(out i int)
beginselect i; -- 返回结果i,i=Nullset i=2;select i; -- 返回结果i,i=2
end-- 调用存储过程test,并传入一个参数i=1
set @i=1; -- 定义全局变量i
call test(@i);
select @i; -- 返回结果i,i=2-- 由以上代码可知当存储过程的参数为out时,变量的值不会被传入,并且存储过程内部的赋值运算可以影响到外部传入的变量
-- 创建一个存储过程,参数为inout
create procedure test(inout i int)
beginselect i; -- 返回结果i,i=1set i=2;select i; -- 返回结果i,i=2
end-- 调用存储过程test,并传入一个参数i=1
set @i=1; -- 定义全局变量i
call test6(@i);
select @i; -- 返回结果i,i=2-- 由以上代码可知当存储过程的参数为out时,会传入变量的值,并且存储过程内部的赋值运算可以影响到外部传入的变量

3. 调用存储过程 call

存储过程的调用使用call关键字
例如:

-- 将tab_sale表中sale_name字段值等于'辣条'的记录删除
create procedure delete_sale(in pcd_sale_name varchar(3))
delete from tab_table
where tab_table.sale_name= pcd_sale_name ;-- 调用存储过程delete_sale
call delete_sale('辣条');

4. 查看存储过程

4.1. 查看存储过程的状态

语法如下:

show procedure status like '[状态名]';

[状态名]可以查看博客:show status 查看各种状态

例如:

--查看查询时间超过long_query_time秒的查询的个数。
show procedure status like 'slow_queries';
4.2. 查看存储过程的定义

语法如下:

show create procedure '[过程名]'

例如:

-- 查看存储过程delete_sale的定义
show create procedure delete_sale

结果如下:

Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
delete_sale ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root@localhostPROCEDUREdelete_sale`(in pcd_num int) delete from tab_sale where tab_sale.num = pcd_num utf8mb4 utf8mb4_0900_ai_ci utf8mb4_0900_ai_ci
4.2. 从information_schema.Routines表查看存储过程的信息 mysql

MySQL数据库的所有存储过程的信息都保存在information_ schema数据库中的routines表中,因此可以使用select语句查询存储过程的相关信息。

语法为:

select * from information_schema.ROUTINES
where routine_name='[过程名]'

例如下面的SQL语句是查看存储过程delete_sale相关信息的语句。

select * from information_schema.ROUTINES
where routine_name='delete_sale'

执行结果如下:

SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE
delete_sale def sqlcourse4 delete_sale PROCEDURE

5. 修改存储过程 alter procedure

修改存储过程的特性可以使用alter procedure关键字,语法如下:

alter procedure [存储过程名] [特性]

例如:

-- 修改存储过程delete_sale,使它可以写数据(modifies sql data)
alter procedure delete_sale modifies sql data;

6. 删除存储过程 drop procedure

语法:

drop procedure [if exists] [存储过程名]

例如:

-- 如果存储过程delete_sale存在,则删除它
drop procedure if exists delete_sale;

存储过程和函数的博客分为三章,链接分别为:

  1. SQL 存储过程 procedure 讲解+代码实例
  2. SQL 函数 function 讲解+代码实例
  3. SQL 存储过程和函数的对比、变量、条件和处理程序、游标、流程控制详解+代码示例

SQL 存储过程 procedure 讲解+代码实例相关推荐

  1. SQL 函数 function 讲解+代码实例

    文章目录 1. 对存储程序的说明 2. 创建函数 create function 3. 调用函数 select 4. 查看函数 4.1. 查看函数状态 show status 4.2. 查看函数定义 ...

  2. SQL存储过程与自定义函数实例

    存储过程 1.create PROCEDURE Sp_Conn_Sort ( @tblName   varchar(255),       -- 表名 @strGetFields varchar(10 ...

  3. oracle查视图的sql,oracle通过v$sql视图查询sql的平均执行时间(代码实例)

    oracle通过v$sql视图查询sql的平均执行时间(代码实例) select sql_text,executions 总执行次数,elapsed_time/1000 总耗时(秒), elapsed ...

  4. java sql函数_Java调用Sql存储过程实例讲解

    1.使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转 义序列.不带参数的 call 转义序列的语法如下所示: {call procedure-n ...

  5. 详细实例全面解析SQL存储过程

    存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,类似一门程序设计语言,也包括了数据类型.流程控制.输入和输出和它自己的函数库.存储过程可以说是一个记录集,它是由一些 ...

  6. SQL Server 数据库的维护(一)__存储过程(procedure)

    --维护数据库-- --存储过程(procedure)-- --概述: SQl Serve的存储过程是由一个或多个T-SQL语句组成的一个集合.常用的程序代码段通常被创建成存储过程,一次创建多次调用, ...

  7. SQL存储过程实例具体解释

    SQL存储过程实例具体解释 本文用3个题目,从建立数据库到创建存储过程,具体解说数据库的功能. 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 说明 s ...

  8. JDBC 存储过程(使用java代码编写sql 存储过程)

    1.定义一个存储过程(不带参数) 使用sql语句定义一个存储过程挺简单的,参考这一篇博文https://blog.csdn.net/qq_44973159/article/details/914919 ...

  9. SQL存储过程(Stored Procedure)

    SQL存储过程(Stored Procedure) 什么是存储过程? 存储过程(procedure)类似于C语言中的函数 用来执行管理任务或应用复杂的业务规则 存储过程可以带参数,也可以返回结果 存储 ...

最新文章

  1. 谷歌「模型汤」靠微调屠了ImageNet的榜!方法竟然只有半页纸
  2. python爬虫原理-python学习之python爬虫原理
  3. 《理解 ES6》阅读整理:块绑定(Block Binding)
  4. java生成动态验证码_动态生成验证码案例
  5. CCIE-LAB-第十篇-BGP-VPNV4+VNPN6+MPLS+关闭TTL
  6. MySQL优化(2)--------常用优化
  7. git fetch 与 git pull
  8. 用python画渐变的圆_python画环形图的方法
  9. 基于wxpython+MySQL--实现人脸检测识别的宿舍人脸检测系统
  10. 系统学习NLP(四)--数据平滑
  11. 用Python放一场浪漫的烟花秀!
  12. 【算法】冒泡排序图文讲解
  13. arduino: 各种Arduino基础器件的用法图
  14. 大数据时代,IT行业的热门岗位有哪些?9大前景分析
  15. 认识计算机综合题,第一章 认识计算机试题.doc
  16. NullPointerException丢失异常堆栈信息
  17. linux美化桌面,Linux_设置动态壁纸来美化Ubuntu桌面,我们知道你想拥有一个有格调 - phpStudy...
  18. 新团队成员之间破冰训练
  19. java操作excel表格详解
  20. 利用linux BT5来破解无线 破解无线

热门文章

  1. linux shell 判断字符串包含
  2. 这一次更新,Ta带来了外卖无门槛通用红包
  3. 河北省计算机应用职称考试,河北省职称计算机应用能力考试.doc
  4. Rides的常用知识点
  5. 今天和大家讲一下怎么实现秒表这个功能Chronometer。很多地方都要用到秒表这个功能,比如视频录制,游戏(1)
  6. cocos creator 四叉树碰撞系统Demo
  7. Web前端-Ajax-02-实例:根据省份id查询省份信息
  8. AnimatorSet组合动画的笔记
  9. 小米4电信4G cm13和魔趣6.0移动信号切换4G 3G的方法
  10. word更改上下页边距