当前位置: 首页 > 编程日记 > 正文

存储过程和存储函数初步

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

存储过程和函数初步

简单的来说,存储过程就是一条或者多条 SQL 语句的集合,可视为批处理文件,但是其作用不仅限于批处理。


###存储程序可以分为存储过程和函数。 MySQL 中创建存储过程和函数使用的程序分别是:CREATE PROCEDURE 和 CREATE FUNCTION。使用 CALL 语句来调用存储过程,只能用输出变量返回值。函数可以从语句外调用,即通过引用名,也能返回标量值。存储过程也可以调用其他存储过程。

###创建存储过程 使用 CREATE PROCEDURE 语句,格式如下

CREATE PROCEDURE sp_name( [proc_parameter] ) 
[characteristics ...] routine_body

CREATE PROCEDURE 为创建关键字,sp_name 为存储过程的名称,proc_parameter 为指定存储过程的参数列表,列表形式如下

[ IN | OUT | INOUT ] param_name type

其中 IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出参数;param_name 表示参数名称,type 表示参数的类型,该类型可以是 MySQL 中数据库中的任意类型。 characteristics 指定存储过程的特性,有以下取值:

  • LANGUAGE SQL: 说明 routine_body 部分是由 SQL 语句组成的,当前系统支持的语言为 SQL,SQL 是 LANGUAGE 特性的唯一值。
  • [NOT] DETERMINISTIC:指明存储过程执行的结果是否正确。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为 NOT DETERMINISTIC。
  • {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}: 指明子程序使用 SQL 语句的限制。CONTAINS SQL 表明子程序包含 SQL 语句,但是不包含读写数据的语句;NO SQL 表明子程序不包含 SQL 语句;READS SQL DATA 说明子程序包含读数据的语句;MODIFIES SQL DATA 说明子程序包含写数据的语句。默认情况下使用 CONTAINS SQL。
  • SQL SECURITY { DEFINER | INVOKER }: 指明谁有权限来执行。DEFINER 表示只有定义者才有权限执行,INVOKER 表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。
  • COMMENT 'string':注释信息,可以用来描述存储过程或函数。 routine_body 是 SQL 代码的内容,可以用 BEGIN...END 来表示 SQL 代码的开始和结束。

存储过程需要复杂的 SQL 语句,并且要有创建存储过程的权限,但是存储过程可以简化操作,同时可以减少操作过程中的失误,因此存储过程是非常有用的。

一个简单的创建存储过程的例子,创建名为allOrder的存储过程

MySQL> DELIMITER //
MySQL> CREATE PROCEDURE allOrder()-> BEGIN-> SELECT SUM(`goods_num`) as `all_num` FROM `tbl_order`;-> END //
MySQL> DELIMITER;

"DELIMITER //" 语句的作用是将 MySQL 的结束符设置为为 //,因为 MySQL 默认语句的结束符为';',为了避免与存储过程中的结束符冲突,需要使用 DELIMITER 改变存储过程中的结束符,并以"END //"结束存储过程。定义完毕之后再使用"DELIMITER;"恢复系统默认结束符。也可以指定其他符号作为结束符。

MySQL> DELIMITER //
MySQL> CREATE PROCEDURE countNum(OUT number INT)-> BEGIN-> SELECT COUNT(1) INTO number FROM `tbl_order`;-> END //
MySQL> DELIMITER;

上述代码的作用是创建一个名为 countNum 的存储过程,讲计算结果放入 number 中。


###编写存储函数 创建存储函数,需要用到 CREATE FUNCTION 语句,基本语法格式如下

CREATE FUNCTION func_name ( [func_parameter] )
RETURNS type
[characteristic...] routine_body

func_parameter 的参数形式为

[ IN | OUT | INOUT ] param_name type

RETURNS type 语句表示函数返回数据的类型。characteristic 指定存储函数的特征,取值与创建存储过程相同。

1.指定参数为 IN、OUT 或 INOUT 只对PROCEDURE 是合法的。FUNCTION 中总是默认为 IN 参数。RETURNS 子句只能对 FUNCTION 做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个 RETURN value 语句。 2.如果在存储函数中的 RETURN 语句返回一个类型不同于函数的 RETURNS 子句中指定的类型的值,返回值将被强制为恰当的类型,比如,如果一个函数返回一个 ENUM 或 SET 值,但是 RETURN 语句返回一个整数,对于 SET 成员集的相应的 ENUM 成员,从函数返回的值是字符串。

创建一个名称为 getOrder 的函数

MySQL> DELIMITER //
MySQL> CREATE FUNCTION getOrder()-> RETURNS int(10)-> BEGIN-> RETURN (SELECT COUNT(*) FROM `tbl_order`);-> END //
MySQL> DELIMITER;

转载于:https://my.oschina.net/OSrainn/blog/791763

相关文章:

asp.net 入门的五个步骤

作者: rob howard 步骤 1:下载和安装 .net sdk asp.net 是作为 .net sdk 的一部分提供的,它是创建、生成和测试基于 .net framework 的应用程序所需要的所有技术的集合。要下载和安装 .net sdk,请前往 msdn online .net 开发人…

我帮公司财务写了个“群发工资条”的Python脚本

作者 | 黄伟呢来源 | 数据分析与统计学之美介绍这是一个很好的Python自动化的案例。对于小公司,采用手动方式一个个发送邮件还是可以的。如果一个上百号,上千号,或者更大规模的公司,我们再一个个发送工资条邮件,就太浪…

[转] vim的复制粘贴小结

转载自: http://blogread.cn/it/article.php?id304 用vim这么久了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不爽;上…

CCNA基础 IP地址子网划分

例:1.2.3.4/28 解析0:https://ws2.sinaimg.cn/large/006aKfj6jw1fa09e02m53j30u01hc7av.jpg 解析1:子网数量:2^n-x ( N表示 "/" 后面的数字;X表示8或16或24 ) (子网数量需要减去8或16视情况决…

一位IT從業人員的心路歷程

一位IT從業人員的心路歷程作者:章立民「Statgraphics統計繪圖入門詳論」是我的第一本著作,時值1990年9月,當時我還是一位大三升大四的學生。屈指算算,14年來,我已經撰寫了60本以上的書籍(簡體版未計算在內)&#xff0c…

面了大厂的 Python 岗后,炸了!

听说 Python 很难学?难在哪里?听说学完不知道做什么,为什么?结合我最近这些年的 Python 学习、开发经验,发现 90% 的人在初学 Python 时都会遇到下面这些问题——1. 没经验根本不知道从何学起,而且应用方向…

{} 与 function() { } , 选用空对象{}来存放keyValue

虽说js里面什么都能当对象,也能用填鸭式方法任意给对象添加属性,属性赋值.但是有些js内置的对象,类型属性也是没办法覆盖的。 贪多必失,写了一个用操作url 的js工具类,这个类上面有个属性叫queryString,我原…

java/android 设计模式学习笔记(1)--- 单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单&#…

实例解说.Net构架下的加密编程

yesky(张悦■yesky) http://www.yesky.com/SoftChannel/72342380484755456/20031225/1756613.shtml 很久以前就一直想写一个加密程序,但是一直感到太麻烦而没有动手,不过在前段时间学习.NET的过程中发现.NET的框架中封装了与加密有关的类。而且要在.NE…

人工智能新手入门学习路线!附学习资源合集

有段时间没跟大家分享编程资源福利了!今天为大家整理了人工智能新手入门学习路线,同时附700分钟的学习资源合集,相信这套福利可以帮你顺利入行AI!文末领取全部资料。一、AI基础好课学习资料整理(约317分钟)…

数据还原到指定时间点的处理示例

--创建测试数据库CREATE DATABASE DbGO--对数据库进行备份BACKUP DATABASE Db TO DISKc:\db.bak WITH FORMATGO--创建测试表CREATE TABLE Db.dbo.TB_test(ID int)--延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点…

kvm cpu的亲和性绑定配置

1.CPU的绑定配置进程的处理器亲和性(process affinity):指将进程绑定到特定的一个或多个cpu上去执行,而不允许将进程调度到其他cpu上。物理cpu:表示真实的cpu个数逻辑cpu:表示所有拥有一个完整真实cpu功能的…

李开复对话Yoshua Bengio:AI技术的下一个突破

7月23日,在SGInnovate主办的“深度科技(Deep Tech)造福人类”活动上,创新工场董事长兼CEO李开复与Element AI联合创始人Yoshua Bengio进行了一场对话,讨论了人工智能的未来发展。Yoshua Bengio是深度学习三大发明人之一…

单链表功能大全

单链表很全的例子&#xff0c;增加&#xff0c;删除&#xff0c;排序&#xff0c;都有了 #include <stdio.h>#include <stdlib.h>typedef struct node{int nDate;struct node *pstnext;}Node;//链表输出void output(Node *head){Node *p head->pstnext;while(N…

Access外键 级联更新、删除

工具栏-->"关系"。 打开主表和从表。 将主表的字段拖动到从表的对应字段。 &#xff08;两个字段要求类型相同。 如果主表是自动编号&#xff0c;那么从表用长整型.&#xff09; Access添加外键约束(1)"实施完整性约束"(2)"左联接"(3)"实…

20161124网络爬虫技术学习

参考书籍&#xff1a;《自己动手写网络爬虫》 网络爬虫的基本操作是抓取网页。 “打开”网页的过程其实就是浏览器作为一个浏览的“客户端”&#xff0c;向服务器端发送了一次请穷求&#xff0c;把服务器端的文件“抓”到本地&#xff0c;再进行解释&#xff0c;展现。更进一步…

关于何种情况下使用DataGrid、DataList或Repeater的一些讨论

作者&#xff1a;Scott Mitchell &#xff3b;概述&#xff3d; WEB开发自从有了基于脚本的WEB编程技术&#xff08;如ASP&#xff09;以来&#xff0c;经历了一个漫长的过程。通过使用微软的ASP.Net技术&#xff0c;传统的ASP中大量的、单调乏味的、重复性的编程工作成为了历史…

UDP客户端不用绑定吗IP和端口?

2019独角兽企业重金招聘Python工程师标准>>> 书上都是这么说的&#xff0c;UDP客户端不用绑定IP和端口&#xff0c;操作系统会给它自动分配端口。。。。 但是虽然没有显示绑定&#xff0c;但是操作系统却似乎做了些隐蔽的事情。 首先&#xff0c;在客户端&#xff0…

算法实现太难了?机器学习也需要开源软件

作者 | Soren Sonnenburg等译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;开源工具已经趋于成熟&#xff0c;这使其能构建大规模的自然场景下的系统。与此同时&#xff0c;机器学习领域为各种应用开发了大量强大的学习算法。但是&#x…

数据库备份定期删除程序的开发。

第一.最近客户的服务器数据库备份每天都在进行&#xff0c;随着数据量的不断的增加&#xff0c;备份也在不断的进行变大。 第二.于是一些问题就出现了客户的服务器的磁盘的空间有限&#xff0c;定期数据库备份文件太大而导致无法进行保存问题。 第三.从而导致了服务器宕机以及服…

Repeater控件的分页问题

作者&#xff1a;zhoubinmail.sdu.edu.cn以前做ASP的时间不算短&#xff0c;可是做ASP.NET我是个新手。前几天做项目&#xff0c;遇到一个问题&#xff0c;要求比较复杂的数据格式显示&#xff0c;用DataGrid非常难实现&#xff0c;后来改用了Repeater控件来实现。不过这样就带…

华为昇腾AI全栈知识深入解读,师资培训沙龙深圳场圆满落幕!

头图 | 视觉中国极度缺乏AI人才&#xff0c;已成为中国人工智能产业发展道路上的瓶颈。在国家政策的支持下&#xff0c;众高校初建AI专业者甚多&#xff0c;但高校教师应掌握哪些知识储备来传道授业&#xff0c;大家都是“摸着石头过河”。将高校AI人才培养教学大纲与厂商成熟落…

[转载] 信息系统项目管理师考试论文写作要点

来源&#xff1a;信管网 网址&#xff1a;http://www.cnitpm.com/pm/4323.html &#xff08;1&#xff09;在论文写作之前&#xff0c;先不要急着动笔&#xff0c;认真把题看清楚&#xff0c;选择自己熟悉的论文&#xff08;考试时&#xff0c;一般是二选一&#xff09;&#x…

POM.xml 标签详解

pom作为项目对象模型。通过xml表示maven项目&#xff0c;使用pom.xml来实现。主要描述了项目&#xff1a;包括配置文件&#xff1b;开发者需要遵循的规则&#xff0c;缺陷管理系统&#xff0c;组织和licenses&#xff0c;项目的url&#xff0c;项目的依赖性&#xff0c;以及其他…

DataRow的序列化问题

来源&#xff1a;CSDN 作者&#xff1a;kroll 在.net里&#xff0c;DataRow类型的对象是不支持序列化的&#xff0c;那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢&#xff1f;呵呵&#xff0c;幸好Datatable是支持序列化的。因此&#xff0c;我们可以自定…

mass Framework event模块 v4

event.js // // 事件模块&#xff08;包括伪事件对象&#xff0c;事件绑定与事件代理&#xff09; // $.define("event",document.dispatchEvent ? "node" : "node,event_fix",function(){// $.log("已加载target模块")var rhoverH…

美国 AI 博士:什么都不会怎么学 Python?

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

puppet 初识

【puppet初识】学习目录 领导说saltstack太慢 机器量一旦上来&#xff0c;saltstack就力不从心&#xff0c;所以要将saltstack转向puppet。【安装背景】系统centos 6.5软件地址:http://downloads.puppetlabs.com/puppet/master: 192.168.100.10agent: 192.168.100.13因为puppe…

ColorMatrix 彩色矩阵

选择自 hbzxf 的 Blog 首先对装配脑袋给出上两片文章的友好回复&#xff0c;还有网友Fisherman一起探讨ColorMatrix话题表示感谢&#xff01;ColorMatrix (彩色矩阵) 类位于System.Drawing.Imaging命名空间 先看看下面的代码 ColorMatrix cm newColorMatrix(newfloat[][]{ n…

​一个参数一张Excel表,玩转Pandas的read_excel()表格读取

作者 | 黄伟呢来源 | 数据分析与统计学之美我觉得很有必要讲述这个文章&#xff0c;进行数据处理的第一步就是Python数据读取。但是你可能没想到&#xff0c;在进行数据读取的同时&#xff0c;我们其实可以配合相关参数做很多事儿&#xff0c;这对于后续的数据处理都是极其有帮…