zoukankan      html  css  js  c++  java
  • MySQL之存储过程实例讲解(创建、调用、查看、修改、删除)

    1、存储过程简介:

    存储过程,英文名Stored Procedure,说简单点,就是将MySQL语句集或必要的程序封装在一个结构体里面,存储在数据库中,供外部调用的一个数据库对象,存储过程在思想上很简单,就是SQL代码的封装与重用。

    优点

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

    缺点

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

    2、学习前准备(主题引出)

    创建一张简单表名为table1,仅有一个列name;

    SQL语句:create table table1(name varchar(10));

    再创建两张表运动员和赛事情况表;

    SQL语句-运动员表:

     create table Players(
     id int(10)  Auto_Increment Not null Primary Key,
     name varchar(20)  Not null,
     age varchar(4) not null,
     gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;

    SQL语句-赛事情况表:

    create table Matches(

    id int(10) Auto_Increment Not null,

    MATCHNO int(5)  Not null,

    TEAMNO Varchar(6)  not Null,

    PLAYERNO int(7) Not null ,

    WON Int(8) not null,

    LOST varchar(2),

    Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;

     

    向三张表插入数据:

    insert into table1 values(78);insert into table1 values('ls');

    insert into players  values(1,'lsq',22,'男');insert into Players  values(2,'lqq',23,'女');

    insert into Matches values(1,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);

    注意:小细节,关于SQL语句结构体是不分大小写的,但表名必须区分大小写,我用的Mysql版本是8.0后的版本。

    这些语句我们可以写成存储语句,外部调用,一次性执行。

     存储过程语句:

    Delimiter //
    CREATE PROCEDURE first_proc()
    BEGIN
    DECLARE x VARCHAR(20) DEFAULT '';
    DECLARE y VARCHAR(20) DEFAULT '';
    DECLARE z VARCHAR(20) DEFAULT '';
    DECLARE m VARCHAR(20) DEFAULT '';
    DECLARE n VARCHAR(20) DEFAULT '';
    DECLARE o VARCHAR(20) DEFAULT '';
    DECLARE p VARCHAR(20) DEFAULT '';
    set x='执行开始了,先删除之前创建的三张表';
    drop table table1;
    drop table Players;
    drop table Matches;
    select x;
    set y='创建第一张table1';
    select y;
    create table table1(name varchar(10));
    set z='创建第二张表Players';
    select z;
    create table Players(
    id int(10)  Auto_Increment Not null Primary Key,
    name varchar(20)  Not null,
    age varchar(4) not null,
    gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;
    set m='创建第三张表';
    select m;
    create table Matches(
    id int(10) Auto_Increment Not null,
    MATCHNO int(5)  Not null,
    TEAMNO Varchar(6)  not Null,
    PLAYERNO int(7) Not null ,
    WON Int(8) not null,
    LOST varchar(2),
    Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;
    set n='向表中插入数据';
    select n;
    insert into table1  values(78);insert into table1 values('ls');
    insert into Players values(1,'lsq',22,'男');insert into Players values(2,'lqq',23,'女');
    insert into Matches values(1 ,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);
    set o='下面是每张表的详细信息';
    select z;
    select * from table1;
    select * from Players;
    select * from Matches;
    set p='结束';
    select p;
    end;
    //
    Delimiter ;
    call first_proc;
     
    在此,你可能会问,我直接执行SQL语句岂不是来得更直接?很明显,你在抬杠了,存储过程的用途绝不仅限于此,这里的重点是引出“存储过程”话题,你有没有发现这里我们仅需调用一下first_proc,预设的所有功能都一步到位了吗
     
    3、存储过程基本语法

    声明语句结束符,可以自定义:

    DELIMITER $$

    DELIMITER //

    其他任意符号都行,结构体写完,推荐都用";" 习惯了。

    声明存储过程:

    CREATE PROCEDURE proc_name(IN p_in int)

    存储过程开始和结束符号:

    BEGIN .... END

    变量定义:

    DECLARE num int unsigned default 100;

    Declare char_1 varchar(10) default '';

    变量赋值:

    set num=23;

    set  char_1='我是齐天大圣';

    存储过程结构体:

    存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
    过程体格式:以begin开始,以end结束(可嵌套)
    BEGIN
      BEGIN
        BEGIN
          statements;
        END
      END
    END

    4、实操
     
    4.1、关于参数
    Create  Procedure   存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
    • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
    • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
    • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
    例1:外部传参到结构体

    Delimiter //
    Create Procedure proc_in(In p_in varchar(20))
    Begin
    select p_in;
    insert into table1 values(p_in);
    select * from table1;
    set p_in='我是牛魔王';
    select p_in;
    End;
    //
    Delimiter ;
    set @p_in='我是齐天大圣';
    call proc_in(@p_in);

    设置传入参数值:

    调用存储过程:  可以看到外部参数被传进存储过程体,然后再插入table1表中,接着在结构体内更改了变量。

    例2:结构体内部参数传到外面

    Delimiter //
    Create Procedure proc_out(Out  p_out  varchar(20))
    Begin
    select p_out;
    set p_out='我是牛魔王';
    insert into table1 values(p_out);
    select  * from  table1;
    End;
    //
    Delimiter ;
    set @p_out='我是太白金星';
    call proc_out(@p_out);

    调用存储过程:可以看出“太白金星”并没有被传到存储过程结构体中。

    select @p_out;  

    结果是结构体中返回的变量“牛魔王”。

    例3:既能输入也能输出

     只需InOut: create procedure inout_param(InOut p_inout  int)
     这里不再详细阐释。
     
    4.2、关于存储过程变量
     
     局部声明变量:DECLARE  variable_name [,variable_name...] datatype [DEFAULT value];
     

    其中,datatype 为 MySQL 的数据类型,如: int, float, date,varchar(length)

    例如:

    DECLARE l_int int unsigned default 400;
    DECLARE l_numeric number(8,2) DEFAULT 9.95;
    DECLARE l_date date DEFAULT '1999-12-31';
    DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
    DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
    变量赋值:
    SET 变量名 = 表达式值 [,variable_name = expression ...]
     set x=500;
     
     在存储过程汇总使用变量:

    CREATE PROCEDURE GreetWorld1()  SELECT CONCAT(@greeting,' World') As "hello world";
    SET @greeting='Hello';
    CALL GreetWorld1( );

     

    在MySQL客户端使用存储变量:读者自行测试

    SELECT 'Hello World' into @x;
    SELECT @x;

    SET @y='Goodbye Cruel World';
    SELECT @y;

    SET @z=1+2+3;
    SELECT @z;

    在存储过程间传递全局范围的用户变量:不推荐,滥用变量会导致难以理解和管理

    CREATE PROCEDURE p1() SET @last_procedure='p1';
    CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
    CALL p1( );
    CALL p2( );

     

     4.3、存储过程查看

     select routine_name from information_schema.routines where routine_schema='数据库名';

     select routine_name from information_schema.routines where routine_schema='shop';
     

    show procedure status where db='shop';

     

    show create procedure  first_proc;    #表示查看创建存储过程的语句

     4.4、删除存储过程
    drop procedure proc_name;
     
    4.5、存储过程修改
     注:存储过程只能修改特征,不能修改过程里面的sql语句及参数变量,如果想对过程体结构更改,只能是删掉存储过程,然后重建。
     
    ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
    characteristic:
      COMMENT 'string'
      |LANGUAGE SQL
      |{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
      |SQL SECURITY { DEFINER | INVOKER }
     

    存储过程的特征characteristic:指定存储的特性

    1、COMMENT 'string'是注释信息;

      LANGUAGE SQL是指明过程体是用sql语言编写的,而不是java或php;

    2、SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行:

      DEFINER表示只有定义者自己才能够执行;

      INVOKER表示调用者可以执行。

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    html学习总结
    16--二叉树的镜像
    17-- 从上到下打印二叉树,按层打印。
    14--反转链表
    14--合并两个排序的链表
    15-- 输入两个二叉树A和B,判断B树是否包含于A树。
    13--输入一个整数数组,实现一个函数来调整数组中数字的顺序
    13--输出链表中倒数第k个节点,
    12--打印1到最大的N为数字。
    10--输入一个十进制的整数,转化为二进制,输出有多少个1
  • 原文地址:https://www.cnblogs.com/Rosen-Walk/p/11192409.html
Copyright © 2011-2022 走看看