(作者:陈玓玏)

定义

存储过程在我的理解里,类似函数的定义,设定好了函数的输入、输出参数、类型,写好了流程,存在数据库里,想用的时候随时可以调用,不需要重新写sql语句,效率很高。而且一般的sql语句间没有逻辑控制,利用存储过程却可以完成很复杂的逻辑控制,加上优化的sql算法,灵活性和功能性都大大提高。

存储过程的结构

  1. 语法:CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体

  2. 参数
    存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用”,”分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
    IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
    OUT:该值可在存储过程内部被改变,并可返回
    INOUT:调用时指定,并且可被改变和返回

  3. 在哪里定义?在哪里执行?
    我用的是MySQL-Front,在数据库名上点击右键,新建过程就可以创建存储过程,在数字1标记的地方点击右键,新建过程,创建存储过程,在数字2标记的地方调用存储过程,当然,也可以通过python连接数据库来调用,在数字3标记的地方查看运行结果。
  4. 有例子吗?
-- 输入参数例子
CREATE PROCEDURE in_param(IN p_in int)   #创建一个存储过程,只定义了输入参数BEGINSELECT p_in;SET p_in=2;SELECT p_in;END;

分别调用以下三句话:

SET @p_in=1;
CALL in_param(@p_in);
SELECT @p_in;

输出结果分别是:1,2,1

 -- 输出参数例子CREATE PROCEDURE out_param(OUT p_out int)BEGINSELECT p_out;SET p_out=2;SELECT p_out;END;

分别调用以下命令:

 SET @p_out=1;
CALL out_param(@p_out);
SELECT @p_out;

输出结果分别是:
空,2,2

-- INOUT参数例子:
CREATE PROCEDURE inout_param(INOUT p_inout int)BEGINSELECT p_inout;SET p_inout=2;SELECT p_inout;END;

分别调用以下命令:

SET @p_inout=1;
CALL inout_param(@p_inout) ;
SELECT @p_inout;

输出结果分别是:
1,2,2

五、有没有更完整的例子?
带if else语句的存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc3`(IN parameter int)
BEGINDECLARE var int;SET var=parameter+1;IF var=0 THENINSERT INTO mysql_study.score VALUES (17);END IF ;IF parameter=0 THENUPDATE mysql_study.score SET degree=degree+1;ELSEUPDATE mysql_study.score SET degree=degree+2;END IF ;END;

调用

SET @parameter=1;
CALL proc3(@parameter);

结果:
由于设置的输入参数为1,则表mysql_study.score中所有的degree值加2。

带循环语句的存储过程:(MySQL没有for循环,只有WHILE-DO…END-WHILE、REPEAT…END REPEAT和LOOP…END LOOP)

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc7`(In v INT)
BEGINDECLARE v INT;SET v=0;LOOP_LABLE:LOOP-- INSERT INTO mysql_study.score (degree) VALUES (v);select degree from  mysql_study.score where degree>90-v ;SET v=v+1;IF v >=5 THENLEAVE LOOP_LABLE;END IF;END LOOP;END;

调用

SET @v=4;
CALL proc7(@v);
SELECT @v;

输出结果:有五次输出,分别是输出>85、86、87、88、89的所有分数列表。

六、输入参数为可以为list变量吗?
可是可以,但是貌似有点麻烦。
参考地址:https://segmentfault.com/q/1010000003003758,我自己没试过,但是看别人是这么回答的,下次有时间试一下。上面的代码都是可用的,我自己修改、测试通过了的。

create procedure sp_split_string
(
@string NVARCHAR(4000)
)
AS
BEGIN
DECLARE @object_id nvarchar(500)
DECLARE @i INT
DECLARE @len INT
print @string
IF (@string IS NULL) OR (LTRIM(@string) = '')
RETURNWHILE CHARINDEX(',',@string) > 0BEGINSET @len = LEN(@string)SET @i = CHARINDEX(',', @string)SET @object_id = LEFT(@string, @i-1)INSERT INTO a (id) VALUES (@object_id)--少做修改,改成需要的sql语句即可SET @string = RIGHT(@string, @len - @i)END
SET @object_id = @string
INSERT INTO a (id) VALUES (@object_id)--少做修改,改成需要的sql语句即可
END
go

–测试

-- select * from a
-- exec sp_split_string '102,103,105,106,107,108,200,500,306,408'
-- select * from a

Oracle的,也没测试过:
https://blog.csdn.net/weeknd/article/details/78412668,https://blog.csdn.net/weeknd/article/details/78412668

-- 创建数组对象
create or replace type tables_array as varray(100) of varchar2(32);
/-- 测试用存储过程
create or replace procedure test_in_list(
--参数区域objlist in tables_array,message out varchar2
) is
--变量区域
begin
--执行区域for i in objlist.first .. objlist.last loopmessage:=message||objlist(i)||',';end loop;commit;
end test_in_list;

如果有同学知道在存储过程中传入list参数的简单方法,也可以留言分享,不过也许直接通过python或者java来调用单次操作的存储过程是最简单的吧。

参考文章:https://www.cnblogs.com/mark-chan/p/5384139.html,https://www.cnblogs.com/mark-chan/p/5384139.html

MySQL存储过程实例相关推荐

  1. mysql存储过程 php_PHP调用MYSQL存储过程实例

    说一下 在PHP页面中调用MYSQL存储过程的方法 以下是几个例子 仅供参考 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') ...

  2. MySql 存储过程实例(附完整注释)

    将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题! MySql存储过程简单实例:                                                       ...

  3. mysql存储过程实例实现查询_Mybatis应用mysql存储过程查询数据实例

    1.创建mysql存储过程,这是个复杂查询加上了判断,比较复杂 CREATE PROCEDURE searchAllList ( IN tradingAreaId VARCHAR (50), IN c ...

  4. c mysql存储过程实例_MySQL存储过程实例

    合作商需求:数据需要保存在EXCEL表格中:用户百度ID  游戏游戏角色名称  最后一次登陆时间  游戏内剩余金币金额,由于此合用商的注册用户有100多万个,也只能用存储过程来查询了,代码如下: DR ...

  5. mysql存储过程实例_mysql存储过程案例讲解

    一.创建存储过程实现传入用户名和密码,插入到admin表中 CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR ...

  6. mysql 统计存储过程实例_MySQL存储过程实例

    一.创建MySQL数据库函数 TCC:无参数,查询fruit表中的所有数据 : TAA:两个参数,查询fruit总共有多少行:查询ids为某个值时水果表的数据 TDD:两个参数,查询ids不等于某个值 ...

  7. mysql存储过程语法 if_mysql存储过程语法 if

    MySql存储过程 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程, ...

  8. mysql存储过程select into_mysql存储过程select into

    mysql数据库存储过程 存储过程简介 存储过程可以简单理解为一条或者多条sql语句的集合,存储过程用来实现将一组关于表的操作的sql语句当作一个整体来执行,存储过程在实际应用中最主要的特点的事提高执 ...

  9. mysql 存储过程 out 用处_mysql存储过程 OUT or INOUT argument 3 for routine

    mysql存储过程出现: OUT or INOUT argument 3 for routine gotask.UserLogin is not a variable or NEW pseudo-va ...

  10. mysql存储过程call_mysql call 存储过程

    PHP调用MYSQL存储过程实例 PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例 ...

最新文章

  1. 取消tableView多余的横线
  2. 基于sparksql调用shell脚本运行SQL
  3. Linux下的帮助命令(man/help/info)
  4. 迷你linux设备,ComputeLab发布MintBox迷你PC:专为Linux系统玩家打造
  5. python比较两个二进制文件_python三种方法判断文件是否为二进制文件
  6. 潘正磊:再过三五年 AI会变成开发人员的基本概念
  7. 云上的Growth hacking之路,打造产品的增长引擎
  8. go kegg_玩转GO和KEGG富集因子图的N种姿势: 3种数据处理(含在线筛选条目),3种排序方式,本地交互图片...
  9. int 和String之间的互转
  10. db设计专用excel_电磁兼容(EMC):工程师必备之硬件EMC设计规范
  11. Java8函数式编程详解
  12. pytest框架(三)
  13. 用户体验--NPS满意度指标
  14. 新手学编程前端好还是后端?
  15. cle IMP-00015: 由于对象已存在, 下列语句失败
  16. P2437 蜜蜂路线
  17. 爬取QQ音乐周杰伦前五页歌曲的歌词
  18. pythondictrunoob_Python3 字典 | 菜鸟教程
  19. [leetcode] 766. Toeplitz Matrix @ python
  20. 魔兽发信息给其他服务器的人,魔兽世界怎么跨服密人(魔兽怀旧服可以跨服组队吗)...

热门文章

  1. 【信号与系统】(二十一)拉普拉斯变换与复频域分析——拉普拉斯变换及其性质
  2. 身份证前6位地区编码sql
  3. 史上最全Linux面试题(2020最新版)
  4. MS SQL数据库置疑解决办法
  5. 几款流行的开源后台管理框架
  6. html时钟自动刷新抖音,抖音上炫酷的网红文字时钟
  7. 装机必备:微软常用运行库合集,2022版
  8. 如何获取qq群成员的资料信息(爬虫)
  9. 高响应比优先调度算法(HRRN)例题详解
  10. 微信抖音社区团购小程序源码开发方案怎么做