• MySQL存储过程示例


    为了演示MySQL中的存储过程,我们先创建一些表和数据:

    drop table if exists my_test_table;
    create table my_test_table (
    	id integer primary key not null AUTO_INCREMENT,
    	name varchar(20),
    	age integer,
    	point double
    );
    insert into my_test_table (name,age,point) values 
    	('刘德华',40,10.0),('周杰伦',30,20.0),('周星驰',20,40.0),('范晓萱',20,20.0),('陈绮贞',10,10.0),
    	('朴树',30,12.0),('谢天笑',40,10.0),('谢春花',20,10.0),('房东的猫',50,100.0),('许巍',30,10.0);
    

    然后创建一个空参数的存储过程:

    delimiter //
    create procedure test_procedure1()
    begin 
    	select avg(point) as pointaverage
    	from my_test_table;
    end //
    delimiter ;
    

    然后运行这个存储过程:

    call test_procedure1()
    

    可以看到结果如下:

    pointaverage|
    ------------|
            24.2|
    

    删除存储过程:

    drop procedure test_procedure1
    

    注:这一点好像和DB2不一样。因为我之前在DB2下编写过存储过程,DB2可以定义同名但是不同参数的存储过程,然后DB2删除存储过程的时候是要带参数的。

    下面的示例是带3个输出参数的存储过程示例:

    drop PROCEDURE if exists test_procedure;
    delimiter //
    create procedure test_procedure(
    	OUT pl double,
    	OUT ph double,
    	out pa double
    )
    begin 
    	select min(point) as pointlow
    	into pl
    	from my_test_table;
    	select max(point) as pointhigh
    	into ph
    	from my_test_table;
    	select avg(point) as pointaverage
    	into pa
    	from my_test_table;
    end //
    delimiter ;
    

    但是发现报错了,报错信息如下:

     SQL 错误 [S1009]: Parameter pl is not registered as an output parameter
    

    初步估计是因为变量是需要在调用存储过程之前定义的,所以先定义一下变量:

    set @pointlow=0,@pointhigh=0,@pointaverage=0;
    

    重新运行,发现还是报一样的错。
    我暂时没有发现解决办法~~
    但是我按照下面这条语句执行了一下,发现是可以的:

    call test_procedure(?,?,?);
    

    并且是有输出的:

    1 |2  |3   |
    --|---|----|
    10|100|24.2|
    

    所以我猜想存储过程在MySQL 8中有所改变。

    下面的存储过程包含输入参数,每调用一次会往my_test_table表中插入一条数据:

    drop PROCEDURE if exists test_procedure;
    delimiter //
    create procedure test_procedure(
    	IN in_name varchar(20),
    	IN in_age integer,
    	IN in_point double,
    	out pa double
    )
    begin 
    	insert into my_test_table (name,age,point) values (in_name,in_age,in_point);
    	select avg(point) as pointaverage
    	into pa
    	from my_test_table;
    end //
    delimiter ;
    

    然后调用一下存储过程:

    call test_procedure('言承旭',30,1.1,?);
    

    输出如下:

    1                 |
    ------------------|
    22.099999999999998|
    

    可以发现言承旭的到来拉低了班级的平均分数。

  • 相关阅读:
    605. Can Place Flowers
    1184. Distance Between Bus Stops
    1711. Count Good Meals
    1710. Maximum Units on a Truck
    566. Reshape the Matrix
    980. Unique Paths III
    212. Word Search II
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/zifeiy/p/10311877.html
Copyright © 2020-2023  润新知