zoukankan      html  css  js  c++  java
  • MySQL存储过程

    一、什么是存储过程?

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

    存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

    存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

    优点

    • 存储过程可封装,并隐藏复杂的商业逻辑。
    • 存储过程可以回传值,并可以接受参数。
    • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
    • 存储过程可以用在数据检验,强制实行商业逻辑等。

    缺点

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

     

    二、创建存储过程

    • 存储过程就是具有名字的一段代码,用来完成一个特定的功能。
    • 创建的存储过程保存在数据库的数据字典中。

     

    语法格式如下:

    CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
    [过程参数[,…] ] 格式
    [ IN | OUT | INOUT ] <参数名> <类型>

     

     

     语法说明如下:

    1) 过程名

    存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即 db_name.sp_name。需要注意的是,名称应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。

    2) 过程参数

    存储过程的参数列表。其中,<参数名>为参数名,<类型>为参数的类型(可以是任何有效的 MySQL 数据类型)。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有 1 个或多个参数。

    MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。需要注意的是,参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。

    3) 过程体

    存储过程的主体部分,也称为存储过程体,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。

    在存储过程的创建中,经常会用到一个十分重要的 MySQL 命令,即 DELIMITER 命令,特别是对于通过命令行的方式来操作 MySQL 数据库的使用者,更是要学会使用该命令。

    在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。为解决这个问题,通常可使用 DELIMITER 命令将结束命令修改为其他字符。

    DELIMITER $$

    语法说明如下:

    • $$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。
    • 当使用 DELIMITER 命令时,应该避免使用反斜杠“”字符,因为它是 MySQL 的转义字符。

    三、调用存储过程:

           call 存储过程名[(传参)];
     

    示例:

    1、创建数据库,备份数据表用于示例操作:

    mysql> create database db1;

    mysql> use db1;

    mysql> create table PLAYERS as select * from TENNIS.PLAYERS;

    mysql> create table MATCHES as select * from TENNIS.MATCHES;

     

    2、创建存储过程,删除给定球员参加的所有比赛:

          mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)

    mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)

    -> BEGIN

    -> DELETE FROM MATCHES

    -> WHERE playerno = p_playerno;

    -> END$$ Query OK, 0 rows affected (0.01 sec)

    mysql> delimiter;  #将语句的结束符号恢复为分号

     

    3、调用存储过程

    mysql> calldelete_matches(57);

     

    四、存储过程的参数

    MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

    CREATE  PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])

    • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
    • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

    INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

  • 相关阅读:
    odoo开发笔记 -- 新建模块扩展原模块增加菜单示例
    div内部div居中
    Css中!important的用法
    SQLServer日期格式转换
    jquery中innerheight outerHeight()与height()的区别
    简单明了区分escape、encodeURI和encodeURIComponent
    PDF预览之PDFObject.js总结
    PDFObject.js,在页面显示PDF文件
    System.IO.Directory.GetCurrentDirectory与System.Windows.Forms.Application.StartupPath的用法
    angular 模块 @NgModule的使用及理解
  • 原文地址:https://www.cnblogs.com/lone5wolf/p/11520451.html
Copyright © 2011-2022 走看看