面向考试数据库—数据库编程(Ⅰ)

在这里插入图片描述
面向考试数据库系列博客以笔者的思维脑图为主线,博文内容为笔者对导图的具体分支所作的详细阐述,本篇博文,主要内容为数据库编程,其中不足,望读者多加指正。

存储过程

 使用存储过程的优点:
(1)存储过程在服务器端运行,执行速度快。
(2)存储过程执行一次后,驻留在高速缓冲存储器,在以后的操作中,只需调用已编译好的二进制代码执行,提高了系统性能。
(3)确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。
笔者感觉其下像是MySQL的函数语言。

创建

  • 创建语法
CREATE PROCEDURE 存储过程名 ([参数[,...]])存储过程体

参数:存储过程的参数,格式如下:
        [ IN | OUT | INOUT ] 参数名 类型

 当有多个参数的时候中间用逗号隔开。存储过程可以有0个、1个或多个参数。 MySQL存储过程支持三种类型的参数:输入参数、输出参数和输入/输出参数,关键字分别是IN、OUT和INOUT。
 输入参数使数据可以传递给一个存储过程。当需要返回一个答案或结果的时候,存储过程使用输出参数。输入/输出参数既可以充当输入参数也可以充当输出参数。
存储过程也可以不加参数,但是名称后面的括号是不可省略的。

 存储过程体:这是存储过程的主体部分,也叫做存储过程体。里面包含了在过程调用的时候必须执行的语句,这个部分总是以BEGIN开始,以END结束。但是,当存储过程体中只有一个SQL语句时可以省略BEGIN-END标志。
例子:编写一个存储过程,实现的功能是删除一个特定会员的信息

 DELIMITER $$
   CREATE PROCEDURE  del_member(IN sfz CHAR(6))
     BEGIN
	DELETE FROM Members WHERE 身份证号=sfz;
     END $$
   DELIMITER ;

 在关键字BEGIN和END之间指定了存储过程体,因为在程序开始用DELIMITER语句转换了语句结束标志为($ *2),所以BEGIN和END被看成是一个整体,在END 后用“$$”结束。当然,BEGIN-END复合语句还可以嵌套使用。
要想查看数据库中有哪些存储过程,可以使用SHOW PROCEDURE STATUS命令。
SHOW PROCEDURE STATUS

  • DECLARE语句
     在存储过程中可以声明局部变量。使用DECLARE语句,在声明局部变量的同时也可以对其赋一个初始值。
    语法格式
 DECLARE 变量[,...] 类型 [DEFAULT]

例子:声明一个整型变量和两个字符变量。

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

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

  • SET语句
     使用SET语句赋值,要给局部变量赋值可以使用SET语句。
    语法格式:
SET 变量名1 = 表达式1 [,变量名2 = 表达式2] ...

例子:

在存储过程中给局部变量num赋值为1,str1赋值为'hello'SET num=1, str1= 'hello';
  • SELECT…INTO语句
     使用这个SELECT…INTO语法可以把选定的列值直接存储到变量中。因此,返回的结果只能有一行。
语法格式为:
     SELECT 列名 [,...] INTO 变量名 [,...]  数据来源表达式

调用

 存储过程创建完后,可以在程序、触发器或者存储过程中被调用,调用时都必须使用到CALL语句。

扫描二维码关注公众号,回复: 11266658 查看本文章
  • CALL语句
CALL 存储过程名( [参数 [,...]])

删除

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

  • DROP语句
DROP PROCEDURE  [IF EXISTS] 存储过程名

语法补充

条件语句

  • IF语句举例
    创建存储过程,判断两个输入的参数哪一个更大。
DELIMITER $$
CREATE PROCEDURE COMPAR
(IN K1 INTEGER, IN K2 INTEGER, OUT K3 CHAR(6) )
BEGIN
	IF K1>K2 THEN
		SET K3= '大于';
	ELSEIF K1=K2 THEN
		SET K3= '等于';
	ELSE 
		SET K3= '小于';
	END IF;
END$$
DELIMITER ;
  • 调用存储过程举例
CALL COMPAR(3, 6, @K);
SELECT @K;

在这里插入图片描述

  • CASE语句
CASE 表达式
                 WHEN1 THEN 语句序列1
                  [WHEN2 THEN语句序列2] ...
                  [ELSE语句序列e]
           END CASE
或者:
          CASE
                WHEN 条件1  THEN 语句序列1
                [WHEN条件2  THEN语句序列2] ...
                [ELSE语句序列e]
           END CASE

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

DELIMITER $$
      CREATE PROCEDURE var_cp
	(IN str VARCHAR(1), OUT direct VARCHAR(4) )
      BEGIN
          CASE str
	WHEN 'U' THEN SET direct ='上升';
	WHEN 'D' THEN SET direct ='下降';
	ELSE  SET direct ='不变';
         END CASE;
      END$$
      DELIMITER ;
以上的CASE语句用第二种格式来写如下:
      CASE 
	WHEN str=' U' THEN SET direct ='上升';
	WHEN str=' D' THEN SET direct ='下降';
	ELSE  SET direct ='不变';
      END CASE;

循环语句

  • WHILE语句语法格式
WHILE条件  DO
	程序段
         END WHILE [结束标号]
  • REPEAT语句
REPEAT
                    程序段
      UNTIL 条件
      END REPEAT [结束标号]
  • LOOP语句
 [开始标号:] LOOP
                             程序段
            END LOOP [结束标号]

上机作业

第一部分

1、创建存储过程,实现给出学号,在学生表中删除该学生记录。并调用该存储过程,删除学号为020018的记录。

DELIMITER $$
   CREATE PROCEDURE  del_Sid(IN student_Sid CHAR(6))
     BEGIN
	DELETE FROM student	WHERE student.Sid =student_Sid;
     END $$
   DELIMITER ;
 call del_Sid(020018);

2、创建存储过程,实现查询sc表中各门课平均分,并调用该的存储过程。

 DELIMITER &&
CREATE PROCEDURE avg_score()
BEGIN
SELECT Cid,ROUND(AVG(score),2) AS '平均成绩' FROM sc GROUP BY Cid;
END &&
DELIMITER;
CALL avg_score();
 

在这里插入图片描述

第二部分

1、创建存储过程,输入学号bh ,输出该学生的性别。(存疑)

DELIMITER &&
CREATE PROCEDURE  SEX1(IN student_Sid VARCHAR(10) OUT sex varchar(10) )
     BEGIN
	SELECT Sage from student	WHERE Sid =student_Sid;
	sex  = Sage
     END $$
   DELIMITER ;

2、sc表增加一列奖学金,创建存储过程,输入学号bh和成绩jb两个参数,如果jb大于90,该学生奖学金500元, jb为80-90,该学生奖学金300元,jb为70-80,该学生奖学金150元,jb为其他值,该学生奖学金0元。

ALTER TABLE sc ADD 奖学金 INT DEFAULT 0;

DELIMITER &&
CREATE PROCEDURE get_scholarship(IN bh varchar(10),IN jb decimal(8,1),OUT money int(3))
BEGIN
	IF jb>=90
		THEN UPDATE sc SET 奖学金 =500 WHERE Sid=bh AND score=jb;
	ELSEIF jb>=80
		THEN UPDATE sc SET 奖学金 =300 WHERE Sid=bh AND score=jb;
	ELSEIF jb>=70
		THEN	UPDATE sc SET 奖学金=150 WHERE Sid=bh AND score=jb;
	ELSEIF jb<=70
		THEN	UPDATE sc SET 奖学金=0 WHERE Sid=bh AND score=jb;
	END IF;
END &&

3、创建存储过程,比较两个学生的年龄,如前者比后者高就输出0,否则输出1。并调用该存储过程比较”000001”和”000002”两学生的收入。

DROP PROCEDURE IF EXISTS compar();
DELIMITER &&
CREATE PROCEDURE compar(IN s1 CHAR(9),IN s2 CHAR(9),OUT outcome INT)
BEGIN
	DECLARE h1,h2 SMALLINT;
	SELECT Sage INTO h1 FROM Student WHERE Sid=s1;
	SELECT Sage INTO h2 FROM Student WHERE Sid=s2;
	IF h1>h2 
		THEN SET outcome=0;
	ELSE
		SET outcome=1;
	END IF;
END &&
DELIMITER;
call compar(01,02,@k);
SELECT @k;

此处的例子一笔者数据表所含的数据为例。
在这里插入图片描述

第三部分

1、创建存储过程,输入一个数x ,输出x!。

DROP PROCEDURE IF EXISTS factorial;
DELIMITER $$
create PROCEDURE factorial(IN x int ,OUT s int)
BEGIN
DECLARE a INT DEFAULT 1;
SET s=1
WHILE a <=x DO
set s=s*a;
set a=a+1;
END WHILE;
END $$
DELIMITER;

2、创建存储过程DO_hz1,作用是向salary表中插入汇总行(合计,收入总和,支出总和)。创建另外一个存储过程DO_show2,在其中调用第一个存储过程,并输出汇总结果。(假设有表)

DELIMITER $$
create procedure DO_hz1()
begin
  ALTER TABLE salary ADD 合计 INT DEFAULT 0 , 收入总和 INT DEFAULT 0 , 支出总和 INT DEFAULT 0 ; 
end 
END $$
DELIMITER;

DELIMITER $$
create procedure DO_show1(IN id1 int ,IN id2 INT)
begin
declare sr1,sr2 float(8);
select income-outcome into sr1 from salary where employeeid=id1;
select  income-outcome into sr2 from salary where employeeid=id2;
if id1>id2 then set bj=0;
else
set bj=1;
end if;
END $$
DELIMITER;

猜你喜欢

转载自blog.csdn.net/Zengmeng1998/article/details/105886641