【头歌系统数据库实验】实验13 数据库编程-1

2023-12-25 19:43:10

目录

第1关:定义一个名为PROC_COUNT的无参数存储过程

第2关:定义一个名为PROC_JNAME的有参数存储过程

第3关:定义一个名为PROC_JINFO的有参数存储过程

第4关:定义一个名为PROC_AVGGRADE的有参数存储过程

第5关:定义一个名为PROC_SINFO的有参数存储过程

第6关:定义一个名为PROC_JSEARCH的有参数存储过程

第7关:定义一个名为PROC_SUPDATE的有参数存储过程

第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程

第9关:定义一个名为PROC_JGRADE的有参数存储过程


如果对你有帮助的话,不妨点赞收藏评论一下吧,爱你么么哒😘??????

第1关:定义一个名为PROC_COUNT的无参数存储过程

任务描述

定义一个名为PROC_COUNT的无参数存储过程,查询工程名称中含有“厂”字的工程数量,并调用该存储过程。

相关知识

1、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

,

现已构建J表,结构信息如下:

,

2、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_COUNT()
BEGIN
SELECT COUNT(*) 
FROM J 
WHERE JNAME LIKE '%厂';
END ;$
DELIMITER ;

CALL PROC_COUNT();

########## End ##########

第2关:定义一个名为PROC_JNAME的有参数存储过程

任务描述

定义一个名为PROC_JNAME的有参数存储过程,查询输入任意城市的工程项目名称。

相关知识

1、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

,

现已构建J表,结构信息如下:

,

2、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

 
  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JNAME(IN TEMPNAME CHAR(10))
BEGIN
SELECT JNAME 
FROM J 
WHERE J.CITY=TEMPNAME;
END ;$
DELIMITER ;

########## End ##########
#以下代码禁止删除
CALL PROC_JNAME('天津');

第3关:定义一个名为PROC_JINFO的有参数存储过程

任务描述

定义一个名为PROC_JINFO的有参数存储过程,查询输入任意城市的工程项目名称、零件名称以及各零件总数量,结果先按工程项目名称升序排序,再按零件名称升序排序。

相关知识

1、零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成; P表如下图:

,

现已构建P表,结构信息如下:

,

2、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

,

现已构建J表,结构信息如下:

,

3、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,

4、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

 
  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JINFO(IN TEMPNAME CHAR(10))
BEGIN
SELECT DISTINCT JNAME,PNAME,SUM(QTY) AS SUM_QTY
FROM SPJ
LEFT JOIN J
ON J.JNO = SPJ.JNO
LEFT JOIN P
ON P.PNO = SPJ.PNO
WHERE CITY =  TEMPNAME
GROUP BY SPJ.JNO,SPJ.PNO
ORDER BY JNAME,PNAME;
END ;$
########## End ##########
#以下代码禁止删除
CALL PROC_JINFO('天津');

第4关:定义一个名为PROC_AVGGRADE的有参数存储过程

任务描述

定义一个名为PROC_AVGGRADE的有参数存储过程,统计任意一门课的平均成绩。

相关知识

1、课程表Course由课程号(Cno)、课程名(Cname)、先行课(Cpno)、学分(Ccredit)组成。 Course表如下图:

,

现已构建Course表,结构信息如下:

,

创建Course表的Mysql代码为:

CREATE TABLE Course( Cno CHAR(4) PRIMARY KEY, Cname CHAR(9), Cpno CHAR(4), Ccredit INT );

INSERT INTO Course VALUES('1','数据库','5',4); INSERT INTO Course VALUES('2','离散数学','',2); INSERT INTO Course VALUES('3','信息系统','1',4); INSERT INTO Course VALUES('4','操作系统','6',3); INSERT INTO Course VALUES('5','数据结构','7',4); INSERT INTO Course VALUES('6','数据处理','',2); INSERT INTO Course VALUES('7','PaSCal语言','6',4);

2、学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。 SC表如下图:

,

现已构建SC表,结构信息如下:

,

创建SC表的Mysql代码为:

CREATE TABLE SC( Sno CHAR(9), Cno CHAR(4), Grade INT, PRIMARY KEY(Sno, Cno) );

INSERT INTO SC VALUES('200215121','1',92); INSERT INTO SC VALUES('200215121','2',85); INSERT INTO SC VALUES('200215121','3',88); INSERT INTO SC VALUES('200215122','2',90); INSERT INTO SC VALUES('200215122','3',80); INSERT INTO SC VALUES('200215123','1',60); INSERT INTO SC VALUES('200215123','2',75); INSERT INTO SC VALUES('200215124','1',52); INSERT INTO SC VALUES('200215124','2',63); INSERT INTO SC VALUES('200215125','1',100); INSERT INTO SC VALUES('200215125','2',100); INSERT INTO SC VALUES('200215126','2',34); INSERT INTO SC VALUES('200215126','3',45); INSERT INTO SC VALUES('200215127','2',86); INSERT INTO SC VALUES('200215127','3',88);

3、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE myschool;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_AVGGRADE(IN TEMPNAME VARCHAR(10))
BEGIN
SELECT DISTINCT AVG(Grade) AS AVG_Grade
FROM SC,Course
WHERE Cname = TEMPNAME 
AND Course.Cno=SC.Cno;
END ;$

########## End ########## 
# 以下代码禁止删除
CALL PROC_AVGGRADE('数据库');

第5关:定义一个名为PROC_SINFO的有参数存储过程

任务描述

定义一个名为PROC_SINFO的有参数存储过程,查询输入任意供应商供应的工程项目名称、零件名称以及各零件总数量,结果先按工程项目名称升序排序,再按零件名称升序排序。

相关知识

1、供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。 S表如下图:

,

现已构建S表,结构信息如下:

,

2、零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。 P表如下图:

,

现已构建P表,结构信息如下:

,

3、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

,

现已构建J表,结构信息如下:

,

4、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,

5、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_SINFO(IN TEMPNAME CHAR(10))
BEGIN
SELECT DISTINCT JNAME,PNAME,SUM(QTY) AS SUM_QTY
FROM SPJ
LEFT JOIN J
ON J.JNO = SPJ.JNO
LEFT JOIN P
ON P.PNO = SPJ.PNO
LEFT JOIN S
ON S.SNO = SPJ.SNO
WHERE SNAME =  TEMPNAME
GROUP BY SPJ.JNO,SPJ.PNO
ORDER BY JNAME,PNAME;
END ;$

########## End ##########
#以下代码禁止删除
CALL PROC_SINFO('精益');

第6关:定义一个名为PROC_JSEARCH的有参数存储过程

任务描述

定义一个名为PROC_JSEARCH的有参数存储过程,当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME),结果先按供应商名称升序排序,再按零件名称升序排序。

相关知识

1、供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。 S表如下图:

,

现已构建S表,结构信息如下:

,

2、零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。 P表如下图:

,

现已构建P表,结构信息如下:

,

3、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

,

现已构建J表,结构信息如下:

,

4、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,

5、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JSEARCH(IN TEMPNAME CHAR(3))
BEGIN
SELECT DISTINCT SNAME,PNAME,JNAME
FROM SPJ
LEFT JOIN J
ON J.JNO = SPJ.JNO
LEFT JOIN P
ON P.PNO = SPJ.PNO
LEFT JOIN S
ON S.SNO = SPJ.SNO
WHERE J.JNO =  TEMPNAME
GROUP BY SPJ.JNO,SPJ.PNO
ORDER BY SNAME,PNAME;
END ;$

########## End ##########
#以下代码禁止删除
CALL PROC_JSEARCH('J2');

第7关:定义一个名为PROC_SUPDATE的有参数存储过程

任务描述

定义一个名为PROC_SUPDATE的有参数存储过程,按用户输入值更新“供应商表S”,根据输入的供应商代码,将S表中的供应商名称改为输入的供应商名称、城市名称改为输入的城市名称。 注意存储过程的输入参数为供应商代码、供应商名称、城市名称。

相关知识

1、供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。 S表如下图:

,

现已构建S表,结构信息如下:

,

2、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_SUPDATE(IN SNOTEMP CHAR(3),IN SNAMETEMP CHAR(10),IN CITYTEMP CHAR(10))
BEGIN
UPDATE S
SET SNO = SNOTEMP,SNAME = SNAMETEMP,CITY = CITYTEMP
WHERE SNO = SNOTEMP;
END;$
DELIMITER ;

########## End ########## 
#以下代码禁止删除
CALL PROC_SUPDATE('S4', '深技大', '深圳');
SELECT * FROM S;

第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程

任务描述

定义一个名为PROC_AVGWEIGHT的有参数存储过程,要求求出“用户输入的供应商”提供给“用户输入的工程”的“对应所有零件的平均重量”,并将平均重量结果通过输出变量AVG_WEIGHT返回,平均重量的输出取整,按照输入供应商为S2,工程为J2,执行上述存储过程。(注意要考虑零件数量)

相关知识

1、零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。 P表如下图:

,

现已构建P表,结构信息如下:

,

2、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,

3、存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE P_AVG(IN TEMP1 CHAR(10), IN TEMP2 CHAR(10), OUT TEMP3 INT)
BEGIN
  SELECT ROUND(SUM(P.WEIGHT * SPJ.QTY) / SUM(SPJ.QTY)) INTO TEMP3
  FROM P
  LEFT JOIN SPJ ON SPJ.PNO = P.PNO
  WHERE SPJ.SNO = TEMP1 AND SPJ.JNO = TEMP2;
END;$
DELIMITER ;

CALL P_AVG('S2', 'J2', @AVG_WEIGHT);
SELECT @AVG_WEIGHT;

 
 
########## End ########## 

第9关:定义一个名为PROC_JGRADE的有参数存储过程

任务描述

定义一个名为PROC_JGRADE的有参数存储过程,查看某个工程JNO使用零件数量的分布情况,按照S档<1000,M档1000-2000,L档>2000分段统计,按照输入某个工程JNO,输出为该工程号JNO的档次JTYPE。

相关知识

1、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,

2、存储过程定义 定义一个存储过程语句的语法格式如下:

 
  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;

其中: (1)<模式名.存储过程名>:指明被创建的存储过程的名称。 (2)<参数名>:指明存储过程参数的名称。 (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGIN 到 END 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。 (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 IN、OUT 或 IN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT 表示从存储过程返回参数。而 IN OUT 表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由 SQL 语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是 DBA 或该存储过程的拥有者且具有 CREATE PROCEDURE 数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。

相关操作① DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN...END中,且在语句之前,定义变量语法为:

  1. DECLARE 变量名 变量类型 [DEFAULT 初始化值];

例如:

  1. DECLARE a, b INT DEFAULT 5;

② SET定义用户变量 SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

  1. SET @var_name = expr [, @var_name = expr] ...

例如:

  1. SET @name = 'abc', @weight = 20;

③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)]; ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程 ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: ? 过程名:指定要删除的存储过程的名称。 ? IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。 ⑦ OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out; 注意:pp_out可与 p_out同名 ⑧ 修改命令结束符:DELIMITER命令

,

⑨ 使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

 
  1. SELECT col_name[,...] INTO var_name[,...] table_expr

col_name:要从数据库中查询的列字段名; var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量; table_expr:SELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT …INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

,

⑩ 将变量值返回给调用者 在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:

,

创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名

,


开始你的任务吧,祝你成功!

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JGRADE(IN JNOTEMP VARCHAR(10),OUT TEMP VARCHAR(10))
BEGIN
DECLARE NUMBER INT(4);
SELECT SUM(QTY) INTO NUMBER
FROM SPJ
WHERE JNO =JNOTEMP;
IF (NUMBER < 1000)
THEN SET TEMP ='S';
ELSEIF (NUMBER > 1000 & NUMBER < 2000)
THEN SET TEMP ='M';
ELSEIF (NUMBER > 2000)
THEN SET TEMP ='L';
END IF;
END;$
DELIMITER ;


########## End ##########
#以下代码禁止删除
CALL PROC_JGRADE('J1', @JTYPE);
SELECT @JTYPE;

文章来源:https://blog.csdn.net/YK3020936216/article/details/135206613
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。