mysql5 存储过程

2023-10-27

MySql5.0以后均支持存储过程,最近有空,研究了一把这个

格式:

CREATE PROCEDURE 过程名 ([过程参数[,...]])
[特性 ...] 过程体

CREATE FUNCTION 函数名 ([函数参数[,...]])
RETURNS 返回类型
[特性 ...] 函数体

过程参数:
[ IN | OUT | INOUT ] 参数名 参数类型

函数参数:
参数名 参数类型

返回类型:
有效的MySQL数据类型即可

特性:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

过程体/函数体:格式如下:
BEGIN
有效的SQL语句
END

我在这里不关心专有的特性,这些与SQL规范不兼容,所以characteristic(特性)的相关内容不作考虑。
//
在开发过程中有几点要注意:
1、存储过程注释:MySQL支持采用--或者/**/注释,其中前者是行注释,后者是段式注释
2、变量首先用declare申明,其中临时变量可以直接以@前缀修饰以供引用
3、直接采用MySQL的Administrator管理器编辑时,可以直接采用如下函数文本录入;
但若在脚本中自动导入存储过程或函数时,由于MySQL默认以";"为分隔符,则过程体的每一句
都被MySQL以存储过程编译,则编译过程会报错;所以要事先用DELIMITER关键字申明当前段分隔符
用完了就把分隔符还原。 如下所示:
DELIMITER $$
Stored Procedures and Functions
DELIMITER ;
4、MySQL支持大量的内嵌函数,有些是和大型商用数据库如oracle、informix、sybase等一致,
但也有些函数名称不一致,但功能一致;或者有些名称一致,但功能相异,这个特别对于从
这些数据库开发转过来的DBA要注意。
5、存储过程或函数的调试:我目前还没有研究MySQL所带的各种工具包,还不清楚其提供了调试工具
没有,不过编译错误相对好查找;至于业务流程的调试,可以采用一个比较笨的方法,就是创建一
个调试表,在包体中各个流程点都插入一条记录,以观察程序执行流程。这也是一个比较方便的笨
办法。^_^

下面是2个例子,提供了一种字串加密的算法,每次以相同的入参调用都会得到不同的加密结果,
算法相对比较简单,不具备强度。分别以函数和过程的形式分别实现如下:
(1)函数

eg:
CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)
BEGIN
declare string_in varchar(39);
declare string_out varchar(78);
declare offset tinyint(2);
declare outpass varchar(30) default ';
declare len tinyint;
/*declare i tinyint;*/

/**/
set len=LENGTH(inpass);
if((len<=0) or (len>10)) then
return "";
end if;

set offset=(SECOND(NOW()) mod 39)+1; /*根据秒数取模*/
/*insert into testtb values(offset,'offset: ');*/
set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_'; /*密钥*/
set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
/* insert into testtb values(2,outpass);*/
set string_out=CONCAT(string_out,string_out);
set @i=0;
REPEAT
set @i=@i+1;
set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));
/* insert into testtb values(@i+2,outpass);*/
UNTIL (@i>=len)
end REPEAT;

return outpass;
END


(2)过程

CREATE PROCEDURE `pro_addmm`(IN inpass varchar(10),OUT outpass varchar(11))
BEGIN
declare string_in varchar(39);
declare string_out varchar(78);
declare offset tinyint(2);
declare len tinyint;

set outpass=';

set len=LENGTH(inpass);
if((len<=0) or (len>10)) then
set outpass=';
else
set offset=(SECOND(NOW()) mod 39)+1;

set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));

set string_out=CONCAT(string_out,string_out);
set @i=0;
REPEAT
set @i=@i+1;
set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));
UNTIL (@i>=len)
end REPEAT;
end if;
END


//
执行结果如下:
mysql> call pro_addmm('zhouys',@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+---------+
| @a |
+---------+
| U_PI6$4 |
+---------+
1 row in set (0.00 sec)

mysql> call pro_addmm('zhouys',@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+---------+
| @a |
+---------+
| 9P8UEGM |
+---------+
1 row in set (0.00 sec)

mysql> select fun_submm('U_PI6$4');
+----------------------+
| fun_submm('U_PI6$4') |
+----------------------+
| ZHOUYS |
+----------------------+
1 row in set (0.00 sec)

加密算法有几个弱点:
1、不支持大小写
2、不支持中文
3、加密强度不够

有兴趣的人可以研究一下解密函数如何编写,这里就不赘述了。


  1、下载、安装,不用多说(偶喜欢非安装版,解压就能用,方便)

  2、启动MySQL 5 :

  开启一个控制台,并进入到MySQL 的 bin目录下;

  登录,输入: mysql -h localhost -u root -p

  3、选择一个数据库: 偶使用test整个数据库。这个库没有任何的表。

  4、建立一个表:

  mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),

  -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

  5、插入一行数据:

  mysql> INSERT INTO pet

  -> VALUES (′Puffball′,′Diane′,′hamster′,′f′,′1999-03-30′,NULL);

  6、创建一个过程:

  mysql> delimiter // --- 这是定义结束符为“//”

  mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)

  -> BEGIN

  -> SELECT COUNT(*) INTO param1 FROM t;

  -> END

  -> //

  Query OK, 0 rows affected (0.00 sec)

  好,一个过程创建完毕。

  7、执行过程:

  mysql> delimiter ; --- 这是定义结束符为“;”,因为上面定义成了“//”,要改回来,保持习惯一致。

  mysql> CALL simpleproc(@a);

  Query OK, 0 rows affected (0.00 sec)

  mysql> SELECT @a;

  +------+

  | @a |

  +------+

  | 3 |

  +------+

  1 row in set (0.00 sec)

  哈哈,过程调用成功

转载于:https://www.cnblogs.com/moiyer/archive/2011/04/25/2316188.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql5 存储过程 的相关文章

  • WDK李宏毅学习笔记第四周02_Explainable ML

    文章目录 摘要 一 Explainable Machine Learning 二 Why we need Explainable ML 三 Interpretable VS Powerful 3 1 decision tree为什么容易解释
  • MySQL5.6的zip包安装教程

    没有 exe 怎么安装 小编之前可能安装过的软件比较少 还没有遇到过一个软件不是通过 exe程序图形化界面去安装的 所以这次安装mysql5 6可是下了不少的功夫啊 好在有心人 最后成功的安装好的 安装过程中踩得坑一定要分享给你们啊 免得大
  • Java--Calendar类,Date类的简单使用,日期的格式化

    package demo import java text SimpleDateFormat import java util Calendar import java util Date 描述 Calendar类 Date类的简单使用 日

随机推荐

  • AD导入之后器件变绿的问题

    导入之后器件变绿的问题 元件出现绿色是DRC规则检查出错的警告颜色 如果元件没有问题就要考虑是不是DRC规则检查设置问题 一般可能大家经常碰到的是元件距离问题导致的 大多情况是规则没有设置好 具体方法为 设计 gt 规则 将Silk scr
  • 关于make: *** No rule to make target `clean'. Stop.的解决

    在重新编译makefile工程文件时需要用到 make clean 命令 但是最近工程使用make clean的时候总是提示 make No rule to make target clean Stop 很烦的错误 查看makefile 文
  • Qt的Script、Quick、QML的关系与总结

    背景 最近在学QML 感觉也不难 就是一直以来接触 Qt 的脚本类的东西的顺序是Script Quick1 Declarative Quick2 QML 那么每一个都是干什么的呢 这些东西搞的我有点混乱 所以决定把他们的大概都先弄清楚 以便
  • choose when 改在java中_Mybatis choose when用法实例代码

    mybatis choose when的用法实现代码如下所示 mapper xml select a city id as CITYID a level1 maintain unit id as CITYID a county id as
  • bert处理超过512的长文本(强制改变位置编码position_embeddings )

    最近在做 NER 任务的时候 需要处理最长为 1024 个字符的文本 BERT 模型最长的位置编码是 512 个字符 超过512的部分没有位置编码可以用了 处理措施 将bert的位置编码认为修改成 1 1024 前512维使用原始的 1 5
  • Redis 的安装

    1 下载 Redis 源码并解压 打开 Redis 的官网 然后复制其下载的地址 地址如下 http download redis io releases redis 5 0 8 tar gz 复制 复制到下载地址以后 在 shell 下可
  • 使用git的心得感悟 杂烩

    1 git的 gitignore文件里面配置的东西是对还未加入版本控制系统管理的文件或者是目录才有用 对已经加入版本控制的文件是不生效的 一定要将之前的纳入版本控制系统的文件取消版本控制可以使用命令 git rm r cached 加上某文
  • uniapp 返回上一页 携带参数 修改上页面的参数

    uniapp 返回上一页 携带参数 修改上页面的参数 阐述 有些场景我们需要从A页面带着参数到B页面 然后再B页面去修改A页面的这个参数 实现的两种方式 第一种方式 ps 如果是uniapp封装的app 需要安装uniapp内置的调试器 如
  • elementUI的日期选择器获取选择时间的格式,获取时间戳等

    elementUI的日期选择器获取选择时间的格式 获取时间戳等 在使用日期选择器的时候 我们需要把时间进行格式化 然后再传给后端 比如传时间戳 value format timestamp
  • unity 第五期

    原题1 什么是单例 举一个游戏中使用单列的例子 答 单例 啊 那是一种内功心法 而且是行走江湖必备的一种最基本的内功心法 说到单例 我们得要把后面两个字补全 也就是单例模式 单例模式是传说中的23种设计模式之一 为什么DC老湿说其实内功心法
  • 2-2、java详述scope作用

    创建Java项目 一个类是Test类 包名com jd test 一个类是UserInfo类 包名com jd vo 还有一个application xml
  • 使用Python,Matplotlib显示RGB图像

    使用Python Matplotlib显示RGB格式的 图像 1 效果图 2 源码 参考 这篇博客将介绍如何使用matplotlib显示RGB图像 具体是使用matplotlib pyplot和mpimg来加载和显示图像 调用plt axi
  • 电机驱动详解--从原理到智能车驱动(DRV8701)

    目录 1 全H桥电路驱动电机原理 2 H桥工作模式 3 死区控制 1 全H桥电路驱动电机原理 从上图可以看出 电路是由四个NMOS管 一个motor 以及VCC GND所构成的 可以控制栅极的电平高低 来控制NMOS管的开通与关闭 所以可以
  • Jmeter 课程笔记(四)关联

    LR中有手动关联和自动关联 Jmeter中只有手动关联 自动关联准确性低 1 第一种关联方式 Http请求 右键 后置处理器 正则表达式提取器 将其放在生成想要关联的页面下 在页面中找到其位置复制当前区域 源码中有相似的值对该区域进行拓展复
  • vbs之createobject大全

    2007年10月30日 11 12 00 ADO对象ConnectionCommandRecordSetRecordStreamServer CreateObject Scripting FileSystemObject Server Cr
  • 【论文精读】CVRecon: Rethinking 3D Geometric Feature Learning For Neural Reconstruction

    今天读的是一篇发表在ICCV2023上的文章 试图使用mvs的方法来助力neural reconstruction 项目地址 点击前往 文章地址 点击前往 文章目录 Abstract 1 Introduction 2 Related Wor
  • React 开发用到的chrome扩展插件

    1 安装react developer tools开发工具 1 下载地址 https pan baidu com s 1eSZsXDC 下载好是一个crx 格式的文件 把下载后的 crx扩展名的离线Chrome插件的文件扩展名改成 zip或
  • Google colab 阻止自动掉线

    Google colab 可以免费使用GPU TPU等计算资源进行人工智能计算 但计算页面隔一段时间无操作之后就会自动掉线 之前训练的数据都会丢失 最后终于找到了一种可以让其自动保持不离线的方法 用一个js程序自动点击连接按钮 代码如下 f
  • 详细介绍下Rational Rose及其功能与优点

    Rational Rose是一款由IBM公司开发的商业软件工具 主要用于软件建模和设计 它支持多种软件工程方法 如面向对象分析和设计 OOA D 面向过程分析和设计 PPA D 数据流分析和设计 DFD 等 Rational Rose提供了
  • mysql5 存储过程

    MySql5 0以后均支持存储过程 最近有空 研究了一把这个格式 CREATE PROCEDURE 过程名 过程参数 特性 过程体CREATE FUNCTION 函数名 函数参数 RETURNS 返回类型 特性 函数体过程参数 IN OUT