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

存储过程和函数初步

简单的来说,存储过程就是一条或者多条 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

存储过程和存储函数初步相关推荐

  1. Oracle存储过程和存储函数创建

    select * from emp; -----------------存储过程------------------------ --定义create[or replace] procedure 存储 ...

  2. 编程开发之--Oracle数据库--存储过程和存储函数(2)

    上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...

  3. Oralce数据库之存储过程、存储函数、触发器和数据字典

    Oracle数据库总结 Oracle数据库之集合运算 Oracle数据库之数据处理 Oracle数据库之建表和管理表 Oracle数据库之对象视图.索引.序列.同义词 一.存储过程和存储函数 1.概念 ...

  4. java怎么调用存储函数_java中调用存储过程或存储函数的方法

    java中调用存储过程或存储函数的方法 1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{c ...

  5. Oracle的存储过程和存储函数

    存储过程和存储函数:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数. 他们也是数据库的对象,类似于表.视图.索引.序列.同义词等. 存储函数可以用return返回值,而存储过程不可以 ...

  6. oracle as 不可以省略,Oracle:存储过程,存储函数

    什么是存储过程和存储函数:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数. 这个子程序是用PL/SQL写的.可以用Java程序调用,就是完成特定功能的子程序. 用create pro ...

  7. Mysql存储过程和存储函数

    存储过程和存储函数 前言 存储过程的相关操作 创建 调用 查看 删除 语法 变量的定义与赋值 if条件判断 参数 case结构 while循环 repeat循环结构 loop语句 leave语句 游标 ...

  8. oracle 查看函数被哪些触发器引用_oracle如何查看存储过程,存储函数,触发器的具体内容...

    (1)set serveroutput on 实现plsql developer 打印输出 (2)如何查看存储过程,存储函数,触发器的内容 查 user_sources表 eg:查询GET_DEPT_ ...

  9. oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门

    文章思维导图 一. 存储过程和存储函数的定义 定义:存储在数据库中,供所有用户程序调用的子程序叫做存储过程/存储函数.复杂点的解释:存储过程(Stored Procedure),就是一组用于完成特定数 ...

最新文章

  1. linux配置文件怎么把某行后几个字符替换_vim(Linux运维)
  2. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
  3. [LeetCode] Longest Substring Without Repeating Characters
  4. 计划策略-52-没有最终装配和没有MTO的计划
  5. python安装pyqt4_Python-Mac 安装 PyQt4
  6. 优秀第三方库-图片浏览
  7. Vue项目中使用ant-design时设置DatePicker日期控件中文显示
  8. HEVC与VP9编码效率对比
  9. 还原 idea undo commit
  10. 突发!ARM中国区执行董事长兼CEO被免职
  11. Android WallpaperManager 壁纸分析
  12. python-expected an indented block问题解决
  13. 什么软件可以把图片镜像翻转_ios怎么把照片镜面翻转
  14. 静态化freemarker,分布式文件系统minIO
  15. 窗体内公用的数据表,在使用视图和行过滤时的有趣现象
  16. 研究发现有适用于欧洲GDPR法规的加密货币解决方案
  17. Quorum?Quorum!
  18. 项目预算包括管理储备__成本基准只包括应急储备
  19. 转换说明%f %e %g 与精度控制
  20. GADRCRERCERRHRGDWQGKQRCLMECRRREQEED|2243219-65-8

热门文章

  1. Mozilla公布WebVR API标准草案
  2. 用jarsigner对android apk进行签名
  3. View 5.1 重装上阵(4—基础架构篇)
  4. Oracle Exadata 简介
  5. 安装 Enthought Tool Suite 时遇到的问题
  6. IIS7入门之旅:(3)CGI application和FastCGI application的区别
  7. Netty 粘包 拆包 编码 解码 序列化 介绍
  8. 洛谷P1074 靶形数独(跳舞链)
  9. 为什么大家都推荐我学Linux
  10. Linux I2C工具查看配置I2C设备【转】