数据库存储过程和函数(二)

简介: 数据库存储过程和函数

循环语句

(3)while语句

基本结构:

begin
  while([执行条件]) do
  ......
  end while;
end;

新建一个Sscore列:

alter table student add Sscore int;

随机从1~100分插入成绩,输入参数i 作为需要修改成绩的人数,使用while循环一行行修改成绩

drop procedure add_math_score();
delimiter $$
create procedure add_math_score(i int)
begin
  declare n int default 0;
  declare score int default 0;
  while(n<i) do
  begin
    set n=n+1;
    set score=floor(100*rand());
    select score ;
    update student set Sscore=score where Sno=n;
  end;
  end while;
end$$
delimiter ;

  • 修改前12人的成绩为随机数

(4)repeat UNTLL语句

REPEATE…UNTLL 语句的用法和 Java中的 do…while 语句类似,都是先执行循环操作,再判断条件,区别是REPEATE 表达式值为 false时才执行循环操作,直到表达式值为 true停止。

基本结构

begin
  repeat
  ......
  until [跳出条件]
  end repeat;
end;

参照while的例子,结果相同

drop procedure add_math_score();
delimiter $$
create procedure add_math_score(i int)
begin
  declare n int default 0;
  declare score int default 0;
  repeat
  begin
    set n=n+1;
    set score=floor(100*rand());
    select score ;
    update student set Sscore=score where Sno=n;
  end;
  until n>=15
  end repeat;
end$$
delimiter ;
  • repeat 和 while 的区别在于两点,一是条件写的位置,while是在循环块的开头写循环条件,repeat是在结尾处写
  • 二是条件语句,while的条件语句是为真则执行,repeat是条件语句为真时跳出。
  • repeat 的 until 哪一行不加分号;
-- 创建过程
DELIMITER $$
CREATE 
    PROCEDURE demo7(IN num INT,OUT SUM INT)
  BEGIN
       SET SUM = 0;
       REPEAT-- 循环开始
    SET num = num+1;
    SET SUM = SUM+num ;
    UNTIL num>=10
    END REPEAT; -- 循环结束
  END$$
DELIMITER;
CALL demo7(9,@sum);
SELECT @sum;

(5)loop语句

循环语句,用来重复执行某些语句。

执行过程中可使用 LEAVE语句或者ITEREATE来跳出循环,也可以嵌套IF等判断语句。

  • LEAVE 语句效果对于Java中的break,用来终止循环;
  • ITERATE 语句效果相当于Java中的continue,用来跳过此次循环。进入下一次循环。且ITERATE之下的语句将不在进行。

基本结构

begin
  [循环名称]:loop
    ......
    if [跳出条件] then leave [循环条件];
    end if;
  end loop [循环条件];
end

批量添加student表数据:

drop procedure add_data();
delimiter $$
create procedure add_data(i int)
  begin
    declare flag int default 0;
    add_loop:loop
    set flag=flag+1;
      if flag>i then leave add_loop;
      end if;
    insert into student(Sname,Sno,Cno,Ssex,Sage,Sscore) values('批量人',flag+15,1002,'男',22,100);
    end loop add_loop;
  end
delimiter ;

DELIMITER $$
CREATE 
    PROCEDURE demo8(IN num INT,OUT SUM INT)
  BEGIN
       SET SUM = 0;
       demo_sum:LOOP-- 循环开始
    SET num = num+1;
    IF num > 10 THEN
        LEAVE demo_sum; -- 结束此次循环
    ELSEIF num <= 9 THEN
        ITERATE demo_sum; -- 跳过此次循环
    END IF;
    SET SUM = SUM+num;
    END LOOP demo_sum; -- 循环结束
  END$$
DELIMITER;
CALL demo8(0,@sum);
SELECT @sum;

使用存储过程插入信息

DELIMITER $$
CREATE 
    PROCEDURE demo9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20))
  BEGIN
     -- 声明一个变量 用来决定这个名字是否已经存在
     DECLARE s_count INT DEFAULT 0;
     -- 验证这么名字是否已经存在
     SELECT COUNT(*) INTO s_count FROM student WHERE `name` = s_student;  
     IF s_count = 0 THEN
          INSERT INTO student (`name`, sex) VALUES(s_student, s_sex);
    SET s_result = '数据添加成功';
     ELSE
                SET s_result = '名字已存在,不能添加';
                SELECT s_result;
     END IF;
  END$$
DELIMITER;

调用此函数

CALL demo9("Jim","女",@s_result);

八 存储过程的管理

显示存储过程

SHOW PROCEDURE STATUS

显示特定数据库的存储过程

SHOW PROCEDURE STATUS WHERE db = 'db名字' AND NAME = 'name名字';

显示特定模式的存储过程

SHOW PROCEDURE STATUS WHERE NAME LIKE '%mo%';

显示存储过程的源码

SHOW CREATE PROCEDURE 存储过程名;

删除存储过程

DROP PROCEDURE 存储过程名;

后端调用存储过程的实现

在mybatis当中,调用存储过程

<parameterMap type="savemap" id=“usermap"> 
  <parameter property="name" jdbcType="VARCHAR" mode="IN"/>
  <parameter property="sex" jdbcType="CHAR" mode="IN"/>
  <parameter property="result" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>
<insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> 
{call saveuser(?, ?, ?)} 
</insert >

调用数据库管理

HashMap<String, Object> map = new HashMap<String, Object>(); 
  map.put("name", "Jim"); 
  map.put("sex","男");
  userDao.saveUserDemo(map); 
  map.get(“result”);//获得输出参数

存储函数

函数

语法结构

CREATE FUNCTION存储函数名称(参数列表])
RETURNS type [characteristic ..]
BEGIN
-- SQL语句RETURN ...;
END ;

characteristic说明

  • deterministic相同的输入参数产生相同的结果
  • no sql 不包含sql语句
  • READS SQL DATA 包含读取数据的语句 但不包含写入数据的语句

案例

  1. 定义存储函数,获取学生表中成绩大于95分的学生数量
/*
  定义存储函数,获取学生表中成绩大于95分的学生数量
*/
DELIMITER $
CREATE FUNCTION fun_test1()
RETURNS INT
BEGIN
  -- 定义统计变量
  DECLARE result INT;
  -- 查询成绩大于95分的学生数量,给统计变量赋值
  SELECT COUNT(*) INTO result FROM student WHERE score > 95;
  -- 返回统计结果
  RETURN result;
END$
DELIMITER ;
-- 调用fun_test1存储函数
SELECT fun_test1();
-- 删除存储函数
DROP FUNCTION fun_test1;
  1. 计算从1累加到n的值,n为传入的参数值
create function fun1(n int)
returns int DETERMINISTIC
begin
  declare total int default 0;
  while n>0 do
    set total := total + n;
    set n := n - 1;
  end while;
  return total;
end;
select fun1(100);
  1. 删除函数
drop function 函数名;

存储过程和函数区别

  1. 存储过程用户在数据库中完成特定操作或者任务(如插入,删除等),函数用于返回特定的数据
  2. 存储过程声明用procedure,
  3. 存储过程不需要返回类型,函数必须要返回类型
  4. 存储过程可独立执行,函数不能作为独立的plsql执行,必须作为表达式的一部分
  5. 存储过程只能通过out和in/out来返回值,函数除了可以使用out,in/out以外,还可以使用return返回值
  6. sql语句(DML或SELECT)中不可用调用存储过程,而函数可以

应用场景不同

  • 如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数
  • 存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值
  • 可以再SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程

返回值不同

存储函数必须有一个且必须只有一个返回值,并且还要指定返回值的数值类型。

存储过程可以有返回值,也可以没有返回值,甚至可以有多个返回值。

两者赋值的方式不同:

存储函数可以采用select …into …方式和set值得方式进行赋值,只能用return返回结果集。

存储过程可以使用select的方式进行返回结果集。

使用方法不同:

函数可以直接用在sql语句当中,可以用来拓展标准的sql语句。

存储过程,需要使用call进行单独调用,不可以嵌入sql语句当中。

函数中函数体的限制较多:

不能使用显式或隐式方式打开transaction、commit、rollback、set autocommit=0等。

但是存储过程可以使用几乎所有的sql语句。

存储过程和函数相同点

  1. 封装程序逻辑 完成数据处理操作
  2. 都是预编译 比直接写查询语句执行速度快
  3. 都可以带参数 以适应数据处理的需求
    存储过程不需要返回类型,函数必须要返回类型
  4. 存储过程可独立执行,函数不能作为独立的plsql执行,必须作为表达式的一部分
  5. 存储过程只能通过out和in/out来返回值,函数除了可以使用out,in/out以外,还可以使用return返回值
  6. sql语句(DML或SELECT)中不可用调用存储过程,而函数可以

应用场景不同

  • 如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数
  • 存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值
  • 可以再SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程

返回值不同

存储函数必须有一个且必须只有一个返回值,并且还要指定返回值的数值类型。

存储过程可以有返回值,也可以没有返回值,甚至可以有多个返回值。

两者赋值的方式不同:

存储函数可以采用select …into …方式和set值得方式进行赋值,只能用return返回结果集。

存储过程可以使用select的方式进行返回结果集。

使用方法不同:

函数可以直接用在sql语句当中,可以用来拓展标准的sql语句。

存储过程,需要使用call进行单独调用,不可以嵌入sql语句当中。

函数中函数体的限制较多:

不能使用显式或隐式方式打开transaction、commit、rollback、set autocommit=0等。

但是存储过程可以使用几乎所有的sql语句。

存储过程和函数相同点

  1. 封装程序逻辑 完成数据处理操作
  2. 都是预编译 比直接写查询语句执行速度快
  3. 都可以带参数 以适应数据处理的需求

本章笔记是在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正

目录
相关文章
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】9、存储过程
【MySQL 数据库】9、存储过程
205 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
31 0
|
2月前
|
存储 SQL 关系型数据库
MySQL技能完整学习列表7、存储过程和函数——1、存储过程(Stored Procedures)的创建和执行——2、函数(Functions)的创建和使用
MySQL技能完整学习列表7、存储过程和函数——1、存储过程(Stored Procedures)的创建和执行——2、函数(Functions)的创建和使用
35 0
|
1月前
|
数据库连接 API 数据库
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
38 0
|
1月前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
19 1
|
1月前
|
存储 SQL 关系型数据库
Msql第四天,存储过程和函数
Msql第四天,存储过程和函数
43 0
Msql第四天,存储过程和函数
|
1月前
|
SQL 存储 关系型数据库
数据库迁移mssql to pgsql之函数转换
数据库迁移mssql to pgsql之函数转换
|
2月前
|
Oracle 关系型数据库 MySQL
|
2月前
|
存储 数据库
【数据库】分支与循环&函数&存储过程
【数据库】分支与循环&函数&存储过程
24 1
|
2月前
|
存储 Linux 数据库
期末速成数据库极简版【存储过程】(5)
期末速成数据库极简版【存储过程】(5)
20 0