• MySQL之数据库编程(创建存储过程)


            存储过程是存放在数据库中的一段程序,是数据库对象之一。它由声明式的SQL语句(如CREATE、UPDATE和SELECT等语句)和过程式SQL语句(如IF-THEN-ELSE语句组成)。存储过程可以由程序、触发器或另一个存储过程来调用它而激活,实现代码段中的SQL语句。

    使用存储过程的优点

    1、存储过程在服务器端运行,执行速度快。

    2、存储过程执行一次后,其执行代码就驻留在高速缓冲存储器,在以后的操作中,只须从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。

    3、确保数据库的安全。使用存储过程可以完成所有数据库操作,并可以通过编程方式控制上述操作对数据库信息访问的权限。

    目录

     1、存储过程

    1.1、创建存储过程语法:

    1.2、存储过程体

    1.2.1、局部变量

     1.2.2、使用SET语句赋值

     2、显示存储过程

    3、调用存储过程

    4、删除存储过程 

    5、流程控制语句

    5.1、分支语句

    5.1.1、IF语句

     5.1.2、CASE语句

     5.2、循环语句

    5.2.1、WHILE语句

     5.2.2、REPEAT语句

    5.2.3、LOOP语句

    5.3、存储过程的嵌套

     

     1、存储过程

    1.1、创建存储过程语法:

    CREATE PROCEDURE 存储过程名([ 参数[,...] ] )存储过程体

             在MySQL中,服务器处理语句时是以分号为结束标志的。但是在创建存储过程时,存储过程体中可能包含多个SQL语句,每个SQL语句都是以分号为结尾的,这时服务器处理程序遇到第1个分号就会认为程序结束,这肯定是不行的。因此这里使用DELIMITER命令将MySQL语句的结束标志修改为其他符号。

    语法格式:DELIMITER $$

    例:将MySQL结束符修改为2个'#'符号 

    DELIMITER ##;

     执行完这条命令后,程序结束的标志就换为符号“##”了。

    要想恢复使用分号“;”作为结束符,运行 DELIMITER; 这条命令就可以了。

     例:编写一个存储过程,其功能是删除一个特定会员的信息。

    1. DELIMITER $$
    2. CREATE PROCEDURE del(IN sfz CHAR(6))
    3. BEGIN
    4. DELETE FROM Members WHERE 身份证号=sfz;
    5. END $$
    6. DELIMITER ;

    1.2、存储过程体

    1.2.1、局部变量

            在存储过程中可以声明局部变量,他们可以用来存储临时结果。要声明局部变量必须使用DECLARE语句。在声明局部变量的同时也可以对其赋一个初始值。

    语法格式:DECLARE 变量[ ,... ]类型 [ DEFAULT 值 ]

    例:声明1个整型变量和2个字符变量 

    1. DECLARE num INT(4);
    2. DECLARE str1,str2 VARCHAR(6);

            局部变量只能在BEGIN...END语句块中声明。局部变量必须在存储过程的开头就声明,声明完后,可以在声明它的BEGIN...END语句块中使用该变量,其他语句块中不可以使用它。

             在存储过程中也可以声明用户变量,不能混淆这两种变量。局部变量和用户变量的区别在于:局部变量前面没有使用@符号,局部变量在其所在的BEGIN...END语句块处理完后就消失了,而用户变量存在于整个会话当中。

     1.2.2、使用SET语句赋值

    语法格式:SET 变量名=表达式

    例:在存储过程中给局部变量num赋值为1,str赋值为hello

    SET num=1,str='hello';

    1.2.3、SELECT...INTO语句

            使用SELECT...INTO语句可以把选定的列值直接存储到变量中,但返回的结果只能有一行。语法格式:SELECT 列名 [,...] INTO 变量名 [,...] 数据来源表达式

    例:在存储过程体中将Book表中书名为“计算机基础”的作者姓名和出版社的值分别赋给变量name和publish 

    1. SELECT 作者,出版社 INTO name,publish
    2. FROM Book
    3. WHERE 书名='计算机基础';

     2、显示存储过程

            要想查看数据库中有哪些存储过程,可以使用SHOW PROCEDURE STATUS命令。要查看某个存储过程的具体信息,可使用SHOW CREATE PROCEDURE sp_name命令,其中sp_name是存储过程的名称。

    查询当前数据库中的存储过程:

    SHOW PROCEDURE STATUS;

    查看存储过程的创建代码:

    SHOW CREATE PROCEDURE 存储过程名;

    3、调用存储过程

            存储过程创建完后,可以在程序、触发器或者存储过程中被调用,调用时都必须使用CALL语句。语法格式:CALL 存储过程名([参数])

     例:创建存储过程实现查询Members表中会员人数的功能,并执行。

    1、创建查询Members表中会员人数的存储过程

    1. CREATE PROCEDURE query_members()
    2. SELECT COUNT(*)FROM Members;

     2、调用该存储过程

    CALL query_members();

    4、删除存储过程 

            存储过程创建后需要删除时使用DROP PROCEDURE语句。在此之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。

    语法格式:DROP PROCEDURE [ IF EXISTS ] 存储过程名

    例:删除存储过程quer()  

    DROP PROCEDURE IF EXISTS quer();

    5、流程控制语句

            在MySQL中,常见的过程式SQL语句可以用在一个存储过程体中。例如:IF语句、CASE语句、LOOP语句、WHILE语句和LEAVE语句

    5.1、分支语句

    5.1.1、IF语句

    IF-THEN-ELSE语句是控制程序根据不同条件执行不同的操作

    语法格式:

     IF 条件1 THEN 语句序列1

    [ ELSEIF 条件2 THEN 语句序列2 ]...

    [ ELSE 语句序列e ]

    END IF

    例:创建存储过程,判断输入的两个参数n1和n2哪一个更大,结果放在变量result中 

    1、存储过程中设n1和n2为输入参数,result为输出参数 

    1. DELIMITER $$
    2. CREATE PROCEDURE cp_num(IN n1 INTEGER,IN n2 INTEGER,OUT result CHAR(6))
    3. BEGIN
    4. IF n1>n2 THEN
    5. SET result='大于';
    6. ELSEIF n1=n2 THEN
    7. SET result='等于';
    8. ELSE
    9. SET result='小于';
    10. END IF;
    11. END$$
    12. DELIMITER;

     2、调用该存储过程

    1. CALL cp_num(4,5,@D);
    2. SELECT @D;

     5.1.2、CASE语句

            CASE语句可以应用于选择列,也可以应用于存储过程中,两者用法略有不同,以下是介绍CASE语句应用在存储过程中。

    语法格式:

    CASE 表达式

    WHEN 值1 THEN 语句序列1

    [WHEN 值2 THEN 语句序列2]...

    [ELSE 语句序列e]

    END CASE

    或者

    CASE

    WHEN 条件1 THEN 语句序列1

    [WHEN 条件2 THEN 语句序列2]...

    [ELSE 语句序列e]

    END CASE

    例:创建一个存储过程,当给定参数为U时返回“上升”,给定参数为D时返回“下降”,给定其他参数时返回“不变”。

    1. DELIMITER $$
    2. CREATE PROCEDURE var_cp(IN str VARCHAR(1),OUT direct VARCHAR(4))
    3. BEGIN
    4. CASE str
    5. WHEN'U'THEN SET direct='上升';
    6. WHEN'D'THEN SET direct='下降';
    7. ELSE SET direct='不变';
    8. END CASE;
    9. END$$
    10. DELIMITER ;
    11. #或
    12. CASE
    13. WHEN str='U'THEN SET direct='上升';
    14. WHEN str='D'THEN SET direct='下降';
    15. ELSE SET direct='不变';
    16. END CASE;

     5.2、循环语句

            MySQL支持3条用来创建循环的语句,分别是WHILE、REPEAT和LOOP语句。在存储过程中可以定义0个、1个或多个循环语句。

    5.2.1、WHILE语句

    语法格式:

    [ 开始标号:]WHILE 条件 DO

    程序段

    END WHILE [ 结束标号 ]

    说明:语句先判断条件是否为真,为真则执行程序段中的语句,然后再次进行判断,为真则继续循环,不为真则结束循环。

    开始标号和结束标号是WHILE语句的标注。除非开始标号存在,否则不能单独出现结束标号,并且如果两者都出现,他们的名字必须是相同的。

    例:创建1个带WHILE执行5次循环的存储过程。 

    1. DELIMITER $$
    2. CREATE PROCEDURE dowhile()
    3. BEGIN
    4. DECLARE a INT DEFAULT 5;
    5. WHILE a>0 DO
    6. SET a=a-1;
    7. END WHILE;
    8. END$$
    9. DELIMITER ;

    当调用该存储过程时,首先判断a的值是否大于0,如果大于0则执行a-1,否则结束循环。 

     5.2.2、REPEAT语句

    语法格式:

    [ 开始标号:]REPEAT

    程序段

    UNTIL 条件

    END REPEAT [ 结束标号 ]

    说明:REPEAT语句先执行程序段中的语句,然后判断条件是否为真,不为真则停止循环,为真则继续循环。REPEAT也可以被标注。

    例:创建1个带WHILE执行5次循环的存储过程。(上面的不同写法) 

    1. REPEAT
    2. a=a-1;
    3. UNTIL a<1;
    4. END REPEAT;

     REPEAT语句和WHILE语句的区别在于:REPEAT语句先执行语句,后进行判断。而WHILE语句是先判断,条件为真时才执行语句。

    5.2.3、LOOP语句

    语法格式:

    [ 开始标号:]LOOP

    程序段

    END LOOP[结束标号]

    说明:LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造,程序段是需要重复执行的语句。在循环体内的语句一直重复运行至循环被退出,退出时通常伴随着一个LEAVE语句。LEAVE语句经常和BEGIN...END或循环一起使用。

    语法格式:LEAVE 语句标号 

    语句标号是语句中标注的名字,该名字是自定义的。加上LEAVE关键字就可以用来退出被标注的循环语句。

     例:创建1个带WHILE执行5次循环的存储过程。(上面的不同写法) 

    1. DELIMITER $$
    2. CREATE PROCEDURE doloop()
    3. BEGIN
    4. SET @a=5;
    5. Label:LOOP
    6. SET @a=@a-1;
    7. IF @a<1 THEN
    8. LEAVE Label;
    9. END IF;
    10. END LOOP Label;
    11. END$$
    12. DELIMITER ;

     语句中,先定义了一个用户变量并赋值为5,接着进入LOOP循环,标注为Label,执行减1语句,然后判断用户变量a是否小于1,是则使用LEAVE语句跳出循环。

    5.3、存储过程的嵌套

    例: 创建一个存储过程sell_insert(),其作用是向Sell表中插入一行数据。创建另外一个存储过程sell_update,在其中调用第1个存储过程,如果给定参数为0,则修改由第1个存储过程插入记录的“是否发货”字段为“已发货”,如果给定参数为1则删除第1个存储过程插入的记录,并将操作结果输出。

    第1个存储过程:向Sell表中插入一行数据 

    1. CREATE PROCEDURE sell_insert()
    2. INSERT INTO Sell VALUES('17','43045','IS-01',4,30,'2022-08-21',NULL,NULL);

     第2个存储过程:调用第1个存储过程,并输出结果

    1. DELIMITER $$
    2. CREATE PROCEDURE sell_update(IN X INT(1), OUT STR CHAR(8))
    3. BEGIN
    4. CALL sell_insert();
    5. CASE
    6. WHEN x=0 THEN
    7. UPDATE Sell SET 是否发货='已发货'WHERE 订单号='17';
    8. SET STR='修改成功';
    9. WHEN X=1 THEN
    10. DELETE FROM Sell WHERE 订单号='17';
    11. SET STR='删除成功';
    12. END CASE;
    13. END $$
    14. DELIMITER;
  • 相关阅读:
    Litetouch deployment failed, Return Code = -2147024894 0x80070002
    如何从存档服务器上完全删除PDM用户
    QT5 QCamera摄像头
    模拟信号隔离器在水处理控制系统中的应用方案
    猫眼 校园招聘_1面
    Kamiya丨Kamiya艾美捷大鼠成纤维细胞生长因子2说明书
    hdlbits系列verilog解答(always块条件语句)-37
    wuzhicms代码审计
    C++中的继承
    计算机毕业设计django基于python金太阳家居电商平台(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/qq_62731133/article/details/126337293