Kingbase(进仓数据库)-头歌-实验报告六(共14关)
实验要求相关知识创建自定义函数实验环境测试说明相关知识创建自定义函数实验要求相关知识删除函数测试说明相关知识删除函数。
第1关:使用 IF EXISTS..ELSE 流程控制语句
实验要求
在 TESTDB 数据库中使用 IF EXISTS..ELSE 流程控制语句,实现:如果班级表中有班级人数在 37 人以上(包含 37)的班级,则将班级名、学院的详细信息进行显示,否则输出“没有人数在 37 人以上的班级”。
相关知识
IF 语句
条件语句用于依据特定情况选择要执行的操作。PL/SQL 的分支语句有两种:一种是 IF 语句,另一种是 CASE 语句。这两种语句实现条件选择结构。 PL/SQL 有三种格式的 IF 结构,语法格式如下:
- 简单分支,
IF···THEN···END IF。 - 二重分支,
IF···THEN···ELSE···END IF。 - 多重分支,
IF···THEN···ELSIF···THEN···ELSE···END IF
本章重点考察:使用 IF EXISTS..ELSE 流程控制语句
\set SQLTERM/[DECLAREdeclarations] -- 声明部分:在此定义变量、常量、类型、游标等BEGINIF EXISTS(判断条件) -- 执行部分:SQL 语句和 PL/SQL 语句构成的程序的主要部分THEN[可执行语句]END IF;END; -- 标记程序体部分结束/
简单循环 LOOP
简单循环使程序不经过判断就进入循环,在循环体中判断条件是否满足,一旦满足条件,立即退出循环。简单循环 LOOP 的基本语法格式如下:
LOOP<循环体> /* 执行循环体 */IF <条件表达式> THEN /* 测试条件表达式是否符合退出条件 */EXIT; /* 满足退出条件,退出循环 */END IF;END LOOP;
注意: 在简单循环中,如果不人为控制,循环体将会无限执行,一般可通过加入 EXIT 语 句来终止循环。多数数据库管理系统的过程化 SQL 都提供 EXIT、BREAK 或 LEAVE 等循环 结束语句,保证 LOOP 语句块能够结束,但 KingbaseES 只提供了 EXIT。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
IF 语句
条件语句用于依据特定情况选择要执行的操作。PL/SQL 的分支语句有两种:一种是 IF 语句,另一种是 CASE 语句。这两种语句实现条件选择结构。 PL/SQL 有三种格式的 IF 结构,语法格式如下:
- 简单分支,
IF···THEN···END IF。 - 二重分支,
IF···THEN···ELSE···END IF。 - 多重分支,
IF···THEN···ELSIF···THEN···ELSE···END IF
本章重点考察:使用 IF EXISTS..ELSE 流程控制语句
\set SQLTERM/[DECLAREdeclarations] -- 声明部分:在此定义变量、常量、类型、游标等BEGINIF EXISTS(判断条件) -- 执行部分:SQL 语句和 PL/SQL 语句构成的程序的主要部分THEN[可执行语句]END IF;END; -- 标记程序体部分结束/
简单循环 LOOP
简单循环使程序不经过判断就进入循环,在循环体中判断条件是否满足,一旦满足条件,立即退出循环。简单循环 LOOP 的基本语法格式如下:
LOOP<循环体> /* 执行循环体 */IF <条件表达式> THEN /* 测试条件表达式是否符合退出条件 */EXIT; /* 满足退出条件,退出循环 */END IF;END LOOP;
注意:
在简单循环中,如果不人为控制,循环体将会无限执行,一般可通过加入 EXIT 语 句来终止循环。多数数据库管理系统的过程化 SQL 都提供 EXIT、BREAK 或 LEAVE 等循环 结束语句,保证 LOOP 语句块能够结束,但 KingbaseES 只提供了 EXIT。
开始你的任务吧,祝你成功!
/* 请在指定处(Begin和End之间)补全PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
DECLARE
r record;
BEGIN
/******* Begin ******/
IF EXISTS( SELECT *FROM CLASS WHERE gnum>='37' ) --补全1
THEN
FOR r IN( SELECT gname,dept FROM CLASS WHERE gnum>='37') --补全2
LOOP
RAISE NOTICE '%', r;
END LOOP;
ELSE
RAISE NOTICE '没有人数在37人以上的班级'; --补全3
/******* End ******/
END IF;
END;
/
第2关:使用CASE流程控制语句
实验要求
在 TESTDB 数据库中使用 CASE 流程控制语句,实现:从教师表中读取工号、姓名和性别。如果性别字段值为“男”,则输出“M”;如果为“女”,则输出“F”;否则输出“其他”。
相关知识
CASE 语句
利用 CASE 表达式可以进行多分支选择。在 KingbaseES 中,CASE 表达式分为简单表达 式和搜索表达式两种。
- 简单
CASE,语句的语法格式如下:CASE search-expressionWHEN expression [, expression [ …]] THENstatements[WHEN expression [, expression [ …]] THENstatements…][ELSEstatements]END CASE;
CASE的简单形式提供了基于操作数等值判断的有条件执行。
执行过程:search-expression会被计算(一次)且一个接一个地与WHEN子句中的每个expression比较。- 如果找到一个匹配,那么相应的
statements会被执行,并且接着控制会交给END CASE后的下一个语句(后续的WHEN表达式不会被计算)。
- 如果没有找到匹配项,那么
ELSE语句会被执行。但是如果ELSE不存在会报错。 - 搜索 CASE ,语句的语法格式如下:
CASEWHEN boolean-expression THENstatements[WHEN boolean-expression THENstatements…][ELSEstatements]END CASE;
CASE的搜索形式基于布尔表达式真、假的有条件执行。
执行过程:每个WHEN子句的boolean-expression会被依次计算,直到找到一个真的。然后相应的statements会被执行,并且接下来控制会被传递给END CASE后的下一个语句(后续的WHEN表达式不会被计算)。- 如果没有找到为真的结果,那么
ELSE statements会被执行。 - 如果 ELSE 不存在会报错。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
CASE 语句
利用 CASE 表达式可以进行多分支选择。在 KingbaseES 中,CASE 表达式分为简单表达 式和搜索表达式两种。
- 简单
CASE,语句的语法格式如下:CASE search-expressionWHEN expression [, expression [ …]] THENstatements[WHEN expression [, expression [ …]] THENstatements…][ELSEstatements]END CASE;
CASE的简单形式提供了基于操作数等值判断的有条件执行。
执行过程:search-expression会被计算(一次)且一个接一个地与WHEN子句中的每个expression比较。- 如果找到一个匹配,那么相应的
statements会被执行,并且接着控制会交给END CASE后的下一个语句(后续的WHEN表达式不会被计算)。
- 如果没有找到匹配项,那么
ELSE语句会被执行。但是如果ELSE不存在会报错。 - 搜索 CASE ,语句的语法格式如下:
CASEWHEN boolean-expression THENstatements[WHEN boolean-expression THENstatements…][ELSEstatements]END CASE;
CASE的搜索形式基于布尔表达式真、假的有条件执行。
执行过程:每个WHEN子句的boolean-expression会被依次计算,直到找到一个真的。然后相应的statements会被执行,并且接下来控制会被传递给END CASE后的下一个语句(后续的WHEN表达式不会被计算)。- 如果没有找到为真的结果,那么
ELSE statements会被执行。 - 如果 ELSE 不存在会报错。
开始你的任务吧,祝你成功!
/* 请在指定处(Begin和End之间)补全PL/SQL语句,不要改动其他代码 */
SELECT tno, tname,
/******* Begin ******/
CASE sex
WHEN '男' THEN 'M' --补全1
WHEN '女' THEN 'F' --补全2
ELSE '其他' --补全3
END
/******* End ******/
FROM teacher;
第3关:使用FOR流程控制语句
实验要求
在 TESTDB 数据库中使用 FOR 流程控制语句,实现:修改班级表,将软件学院所有班级的人数都加1。
相关知识
FOR-LOOP 循环
FOR-LOOP 循环结构可以有效地编写需要执行特定次数的循环。FOR 必须知道循环多少次。FOR-LOOP 循环是计数型循环,但不需要定义循环变量,系统默认存在一个类型为 INTEGER 的隐式循环变量,每执行一次循环,循环变量的值自动加步长值或减步长值,从而可以控制循环次数。 FOR-LOOP 循环的基本语法格式如下:
[<<label>>]FOR name IN [REVERSE] expression1..expression2 [BY expression] LOOPstatementsEND LOOP [label];
其中,参数的意义如下。 ① name:变量名,自动定义为类型 INTEGER 且只在循环内存在(任何该变量名的现有定义在此循环内都将被忽略)。 ② REVERSE:表示循环变量从最大值向最小值递减。 ③ expression1 .. expression2:给出范围上、下界的两个表达式,在进入循环时计算一次。 ④ 如果没有指定 BY 子句,迭代步长为 1,否则步长是 BY 中指定的值,该值也只在循环进入时计算一次。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
FOR-LOOP 循环
FOR-LOOP 循环结构可以有效地编写需要执行特定次数的循环。FOR 必须知道循环多少次。FOR-LOOP 循环是计数型循环,但不需要定义循环变量,系统默认存在一个类型为 INTEGER 的隐式循环变量,每执行一次循环,循环变量的值自动加步长值或减步长值,从而可以控制循环次数。 FOR-LOOP 循环的基本语法格式如下:
[<<label>>]FOR name IN [REVERSE] expression1..expression2 [BY expression] LOOPstatementsEND LOOP [label];
其中,参数的意义如下。 ① name:变量名,自动定义为类型 INTEGER 且只在循环内存在(任何该变量名的现有定义在此循环内都将被忽略)。 ② REVERSE:表示循环变量从最大值向最小值递减。 ③ expression1 .. expression2:给出范围上、下界的两个表达式,在进入循环时计算一次。 ④ 如果没有指定 BY 子句,迭代步长为 1,否则步长是 BY 中指定的值,该值也只在循环进入时计算一次。
开始你的任务吧,祝你成功!
/* 请在指定处(Begin和End之间)补全PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
DECLARE mviews RECORD;
BEGIN
/******* Begin ******/
FOR gno IN (SELECT* FROM CLASS WHERE gnum='35') --补全1
LOOP
UPDATE class SET gnum=gnum+1 --补全2
WHERE dept='软件'; --补全3
END LOOP;
/******* End ******/
END;
\set SQLTERM ;
第4关:按要求创建自定义函数 1
实验要求
在 TESTDB 数据库中按要求创建自定义函数。 1、函数实现功能:能够根据职称,查询所属该职称的教师信息。 2、调用函数:显示职称为教授的教师信息。
相关知识
创建自定义函数
创建自定义函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype ASDECLAREdeclaration;[…]BEGIN<function_body>[…]RETURN {variable_name | value}END;
其中,各参数的意义如下: ① [OR REPLACE]:可选项,允许修改或替换现有函数。修改函数可在创建函数时增加 OR REPIACE 子句。 ② DECLARE:定义参数(参数名写在前面,类型写在后面)。 ③ BEGIN…END:在中间写函数主体。 ④ RETURNS:指定从函数返回的数据类型。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
创建自定义函数
创建自定义函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype ASDECLAREdeclaration;[…]BEGIN<function_body>[…]RETURN {variable_name | value}END;
其中,各参数的意义如下: ① [OR REPLACE]:可选项,允许修改或替换现有函数。修改函数可在创建函数时增加 OR REPIACE 子句。 ② DECLARE:定义参数(参数名写在前面,类型写在后面)。 ③ BEGIN…END:在中间写函数主体。 ④ RETURNS:指定从函数返回的数据类型。
开始你的任务吧,祝你成功!
/* 自定义函数:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE FUNCTION PUBLIC.fun1(Teacher_zc VARCHAR ) --补全1
RETURNS SETOF teacher --补全2
AS
BEGIN
RETURN QUERY
SELECT * FROM teacher --补全3
WHERE title= Teacher_zc; --补全4
END;
\set SQLTERM ;
/* 执行自定义函数 */
SELECT * FROM PUBLIC.fun1('教授');
第5关:按要求创建自定义函数 2
实验要求
在 TESTDB 数据库中按要求创建自定义函数。 1、函数实现功能:能够根据年级名,查询该年级的班级人数,如果班级人数>=37,则输出年级名、班级名和班级人数。 2、调用函数:显示19级的班级信息。
相关知识
创建自定义函数
创建自定义函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype ASDECLAREdeclaration;[…]BEGIN<function_body>[…]RETURN {variable_name | value}END;
其中,各参数的意义如下: ① [OR REPLACE]:可选项,允许修改或替换现有函数。修改函数可在创建函数时增加 OR REPIACE 子句。 ② DECLARE:定义参数(参数名写在前面,类型写在后面)。 ③ BEGIN…END:在中间写函数主体。 ④ RETURNS:指定从函数返回的数据类型。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
创建自定义函数
创建自定义函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype ASDECLAREdeclaration;[…]BEGIN<function_body>[…]RETURN {variable_name | value}END;
其中,各参数的意义如下: ① [OR REPLACE]:可选项,允许修改或替换现有函数。修改函数可在创建函数时增加 OR REPIACE 子句。 ② DECLARE:定义参数(参数名写在前面,类型写在后面)。 ③ BEGIN…END:在中间写函数主体。 ④ RETURNS:指定从函数返回的数据类型。
开始你的任务吧,祝你成功!
/* 自定义函数:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE FUNCTION PUBLIC.fun2(grope_id CHAR) --补全1
RETURNS SETOF class --补全2
AS
BEGIN
RETURN QUERY EXECUTE
'SELECT * FROM class WHERE gnum>=37 and gno=0131901' USING grope_id; --补全3
END;
\set SQLTERM ;
/* 执行自定义函数 */
SELECT gname,grade,gnum FROM PUBLIC.fun2('19级');
第6关:按要求创建自定义函数 3
实验要求
在 TESTDB 数据库中按要求创建自定义函数。 1、函数实现功能:能够向教师表中添加一条记录。 2、调用函数:实现教师记录'0017','崔洛','女','副教授','1974-04-25'的插入。
相关知识
创建自定义函数
创建自定义函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype ASDECLAREdeclaration;[…]BEGIN<function_body>[…]RETURN {variable_name | value}END;
其中,各参数的意义如下: ① [OR REPLACE]:可选项,允许修改或替换现有函数。修改函数可在创建函数时增加 OR REPIACE 子句。 ② DECLARE:定义参数(参数名写在前面,类型写在后面)。 ③ BEGIN…END:在中间写函数主体。 ④ RETURNS:指定从函数返回的数据类型。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
创建自定义函数
创建自定义函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype ASDECLAREdeclaration;[…]BEGIN<function_body>[…]RETURN {variable_name | value}END;
其中,各参数的意义如下: ① [OR REPLACE]:可选项,允许修改或替换现有函数。修改函数可在创建函数时增加 OR REPIACE 子句。 ② DECLARE:定义参数(参数名写在前面,类型写在后面)。 ③ BEGIN…END:在中间写函数主体。 ④ RETURNS:指定从函数返回的数据类型。
开始你的任务吧,祝你成功!
/* 自定义函数:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE FUNCTION PUBLIC.fun3(v_tno varchar ,v_tname varchar ,v_sex varchar , v_title varchar , v_birthday date ) --补全1
RETURNS VOID
AS
BEGIN
INSERT INTO teacher --补全2
VALUES (v_tno,v_tname,v_sex,v_title,v_birthday); --补全3
RETURN;
END;
\set SQLTERM ;
/* 执行自定义函数 */
CALL PUBLIC.fun3('0017','崔洛','女','副教授','1974-04-25'); --补全4
第7关:删除自定义函数
实验要求
删除自定义函数fun1。
相关知识
删除函数
当一个函数不会再用到时,可以使用 DROP FUNCTION 语句执行删除操作,语法格式如下:
DROP FUNCTION [IF EXISTS ] name ([[argmode] [argname] argtype, …]]) [CASCADE | RESTRICT]
其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的函数不存在时不发出错误信息,而是发出一个提示。 ② name:需要删除的函数名称,可以加模式限定。 ③ argmode:参数的模式,有 IN、OUT、INOUT 等。若省略,则默认为 IN。 ④ argname:参数的名称。 ⑤ argtype:函数若有参数,代表函数参数的数据类型。 ⑥ CASCADE:自动删除依赖于要删除的函数的对象(如操作符、触发器),然后删除所 有依赖于那些对象的对象。 ⑦ RESTRICT:若有对象依赖于要删除的函数,则拒绝删除它。默认为 RESTRICT。
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
删除函数
当一个函数不会再用到时,可以使用 DROP FUNCTION 语句执行删除操作,语法格式如下:
DROP FUNCTION [IF EXISTS ] name ([[argmode] [argname] argtype, …]]) [CASCADE | RESTRICT]
其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的函数不存在时不发出错误信息,而是发出一个提示。 ② name:需要删除的函数名称,可以加模式限定。 ③ argmode:参数的模式,有 IN、OUT、INOUT 等。若省略,则默认为 IN。 ④ argname:参数的名称。 ⑤ argtype:函数若有参数,代表函数参数的数据类型。 ⑥ CASCADE:自动删除依赖于要删除的函数的对象(如操作符、触发器),然后删除所 有依赖于那些对象的对象。 ⑦ RESTRICT:若有对象依赖于要删除的函数,则拒绝删除它。默认为 RESTRICT。
开始你的任务吧,祝你成功!
---------- BEGIN ----------
DROP FUNCTION fun1;
---------- END ----------
第8关:创建存储过程 1
实验要求
在 TESTDB 数据库中按要求创建存储过程。 1、存储过程实现功能:能够根据职称,查询所属该职称的教师信息。 2、执行存储过程:显示职称为教授的教师信息。
相关知识
用 CREATE PROCEDURE 命令创建存储过程
当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:
CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]{AS |IS}[LabelName][DECLARE][说明部分]BEGIN语句序列[EXCEPTION 出错处理]END [LabelName];
其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 IS 与 AS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:IN、OUT 和 INOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUT 或 INOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUT 或 INOUT 参数声明的顺序。
游标
1.声明游标
游标在存储过程的声明部分定义。具体方法有如下两种。 (1) 在存储过程中声明游标: 游标名 refcursor; 其中,“游标名”是一个标识符,只被用来对相应的查询进行引用,不可为游标名赋值,也不可将其用于表达式。refcursor 是预定义的 cursor 类型,这个类型允许用户定义 CURSOR,允许运行时为其指定不同的 SQL。此时,游标还没有绑定查询语句,因此游标不能访问。 (2) 使用游标专有声明:
CURSOR 游标名[(arguments)] FOR query;
其中,各参数的意义如下。 ① arguments 为由“,”分隔的参数列表,可以带一个或多个参数,用于打开游标时向游 标传递参数,与存储过程或函数的形式参数类似;打开带参数的游标时,在 OPEN 后的括号内标明实际参数。注意,实际参数的个数及类型必须与游标定义中的形式参数相匹配。 ② query 是由 SELECT 引出的数据查询语句,返回的值存储在游标中。 声明游标的示例,例如:
CURSOR curS FOR SELECT * FROM S;CURSOR curST(mykey integer) FOR SELECT * FROM S WHERE sno = mykey;
2.打开游标
对应打开游标有 3 种方式。打开游标需要使用 OPEN 语句。 ① 打开未绑定的游标 OPEN FOR 方式,其语法格式如下:
OPEN unbound_cursor FOR query;
其中,unbound_ cursor 为游标,打开未绑定的游标,其 query 查询语句是返回记录的 SELECT语句。例如:
OPEN curVars1 FOR SELECT * FROM S WHERE sno = myno;
② 打开未绑定的游标 OPEN FOR EXECUTE 方式,其语法格式如下:
OPEN unbound_cursor FOR EXECUTE query-string;
其中,EXECUTE 将动态执行查询字符串。例如:
OPEN curVars1 FOR EXECUTE 'SELECT * FROM' || quote_idt($1);
注意:“$1”是指由存储过程传递的第 1 个参数。 ③ 打开一个绑定的游标,其语法格式如下:
OPEN bound_cursor [(argument_values)];
此形式仅适用于绑定的游标,只有当该游标在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中。例如:
OPEN curS;OPEN curST('2501105');
3.使用游标
为了处理结果集中的数据,需要检索游标。这需要使用 FETCH 语句,其语法格式如下:
FETCH cursor INTO target;
其中,FETCH 命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过游标属 性“游标名%FOUND”来判断。“%FOUND”用于判断游标是否找到记录,若找到记录,则返回值为 TRUE。用 FETCH 语句提取游标数据,“%NOTFOUND”与“%FOUND”属性恰好相反,若检索到数据,则返回值为 FALSE,否则返回值为 TRUE。例如:
FETCH curVars1 INTO rowvar; -- rowvar 为行变量FETCH curST INTO V_sno, V_sn, V_sex;
注意:① 游标的属性列必须与目标列的数量一致,并且类型兼容;② 变量的个数、顺序及类型要与游标中相应字段保持一致。
4.关闭游标
关闭游标需要使用 CLOSE 语句。其语法格式如下:
CLOSE cursorName;
其中,cursorName 为游标名。例如:
CLOSE curS;
注意:当游标被关闭后,如果需要再次读取游标的数据,需要重新使用 OPEN 打开游标,这时游标将重新查询返回新的结果。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
用 CREATE PROCEDURE 命令创建存储过程
当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:
CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]{AS |IS}[LabelName][DECLARE][说明部分]BEGIN语句序列[EXCEPTION 出错处理]END [LabelName];
其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 IS 与 AS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:IN、OUT 和 INOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUT 或 INOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUT 或 INOUT 参数声明的顺序。
开始你的任务吧,祝你成功!
/* 自定义存储过程:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE PROCEDURE PUBLIC.PROC_1(Teacher_zc VARCHAR) --补全1
AS
DECLARE
r teacher%rowtype;
/* 定义游标cur_t */
cursor cur_t is SELECT *FROM teacher WHERE title=Teacher_zc; --补全2
BEGIN
/* 打开游标cur_t */
OPEN cur_t ; --补全3
LOOP
/* 使用游标cur_t */
FETCH cur_t INTO r; --补全4
IF cur_t%FOUND THEN
RAISE NOTICE '%',r;
ELSE
EXIT;
END IF;
END LOOP;
/* 关闭游标cur_t */
CLOSE cur_t; --补全5
END;
\set SQLTERM ;
/* 执行存储过程 */
CALL PUBLIC.PROC_1('教授');
第9关:创建存储过程 2
实验要求
在 TESTDB 数据库中按要求创建存储过程。 1、存储过程实现功能:能够根据年级名,查询该年级的班级人数,如果班级人数>=37,则输出年级名、班级名和班级人数。 2、执行存储过程:显示19级的班级信息。
相关知识
用 CREATE PROCEDURE 命令创建存储过程
当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:
CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]{AS |IS}[LabelName][DECLARE][说明部分]BEGIN语句序列[EXCEPTION 出错处理]END [LabelName];
其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 IS 与 AS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:IN、OUT 和 INOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUT 或 INOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUT 或 INOUT 参数声明的顺序。
游标
1.声明游标
游标在存储过程的声明部分定义。具体方法有如下两种。 (1) 在存储过程中声明游标: 游标名 refcursor; 其中,“游标名”是一个标识符,只被用来对相应的查询进行引用,不可为游标名赋值,也不可将其用于表达式。refcursor 是预定义的 cursor 类型,这个类型允许用户定义 CURSOR,允许运行时为其指定不同的 SQL。此时,游标还没有绑定查询语句,因此游标不能访问。 (2) 使用游标专有声明:
CURSOR 游标名[(arguments)] FOR query;
其中,各参数的意义如下。 ① arguments 为由“,”分隔的参数列表,可以带一个或多个参数,用于打开游标时向游 标传递参数,与存储过程或函数的形式参数类似;打开带参数的游标时,在 OPEN 后的括号内标明实际参数。注意,实际参数的个数及类型必须与游标定义中的形式参数相匹配。 ② query 是由 SELECT 引出的数据查询语句,返回的值存储在游标中。 声明游标的示例,例如:
CURSOR curS FOR SELECT * FROM S;CURSOR curST(mykey integer) FOR SELECT * FROM S WHERE sno = mykey;
2.打开游标
对应打开游标有 3 种方式。打开游标需要使用 OPEN 语句。 ① 打开未绑定的游标 OPEN FOR 方式,其语法格式如下:
OPEN unbound_cursor FOR query;
其中,unbound_ cursor 为游标,打开未绑定的游标,其 query 查询语句是返回记录的 SELECT语句。例如:
OPEN curVars1 FOR SELECT * FROM S WHERE sno = myno;
② 打开未绑定的游标 OPEN FOR EXECUTE 方式,其语法格式如下:
OPEN unbound_cursor FOR EXECUTE query-string;
其中,EXECUTE 将动态执行查询字符串。例如:
OPEN curVars1 FOR EXECUTE 'SELECT * FROM' || quote_idt($1);
注意:“$1”是指由存储过程传递的第 1 个参数。 ③ 打开一个绑定的游标,其语法格式如下:
OPEN bound_cursor [(argument_values)];
此形式仅适用于绑定的游标,只有当该游标在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中。例如:
OPEN curS;OPEN curST('2501105');
3.使用游标
为了处理结果集中的数据,需要检索游标。这需要使用 FETCH 语句,其语法格式如下:
FETCH cursor INTO target;
其中,FETCH 命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过游标属 性“游标名%FOUND”来判断。“%FOUND”用于判断游标是否找到记录,若找到记录,则返回值为 TRUE。用 FETCH 语句提取游标数据,“%NOTFOUND”与“%FOUND”属性恰好相反,若检索到数据,则返回值为 FALSE,否则返回值为 TRUE。例如:
FETCH curVars1 INTO rowvar; -- rowvar 为行变量FETCH curST INTO V_sno, V_sn, V_sex;
注意:① 游标的属性列必须与目标列的数量一致,并且类型兼容;② 变量的个数、顺序及类型要与游标中相应字段保持一致。
4.关闭游标
关闭游标需要使用 CLOSE 语句。其语法格式如下:
CLOSE cursorName;
其中,cursorName 为游标名。例如:
CLOSE curS;
注意:当游标被关闭后,如果需要再次读取游标的数据,需要重新使用 OPEN 打开游标,这时游标将重新查询返回新的结果。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
用 CREATE PROCEDURE 命令创建存储过程
当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:
CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]{AS |IS}[LabelName][DECLARE][说明部分]BEGIN语句序列[EXCEPTION 出错处理]END [LabelName];
其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 IS 与 AS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:IN、OUT 和 INOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUT 或 INOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUT 或 INOUT 参数声明的顺序。
开始你的任务吧,祝你成功!
/* 自定义存储过程:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE PROCEDURE PUBLIC.PROC_2(Class_gd VARCHAR ) --补全1
AS
DECLARE r record;
/* 定义游标cur_t */
cursor cur_t is SELECT grade,gname,gnum FROM CLASS WHERE gnum>='37' AND gno='0131901'; --补全2
BEGIN
OPEN cur_t;
LOOP
/* 使用游标cur_t */
FETCH cur_t INTO r; --补全3
IF cur_t%FOUND --补全4
THEN
RAISE NOTICE '%',r;
ELSE
EXIT;
END IF;
END LOOP;
CLOSE cur_t;
END;
\set SQLTERM ;
/* 执行存储过程 */
CALL PUBLIC.PROC_2('19级');
第10关:创建存储过程 3
实验要求
在 TESTDB 数据库中按要求创建存储过程。 1、存储过程实现功能:能够向教师表中添加一条记录。 2、执行存储过程:实现教师记录'0099','曲枫','女','讲师','1994-07-04'的插入。
相关知识
用 CREATE PROCEDURE 命令创建存储过程
当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:
CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]{AS |IS}[LabelName][DECLARE][说明部分]BEGIN语句序列[EXCEPTION 出错处理]END [LabelName];
其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 IS 与 AS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:IN、OUT 和 INOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUT 或 INOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUT 或 INOUT 参数声明的顺序。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
用 CREATE PROCEDURE 命令创建存储过程
当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:
CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]{AS |IS}[LabelName][DECLARE][说明部分]BEGIN语句序列[EXCEPTION 出错处理]END [LabelName];
其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 IS 与 AS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:IN、OUT 和 INOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUT 或 INOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUT 或 INOUT 参数声明的顺序。
开始你的任务吧,祝你成功!
/* 自定义存储过程:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE PROCEDURE proc_3(v_tno CHAR ,v_tname VARCHAR ,v_sex CHAR , v_title VARCHAR , v_birthday DATE ) --补全1
AS
BEGIN
INSERT INTO teacher(tno,tname,sex,title,birthday) --补全2
VALUES (v_tno,v_tname,v_sex,v_title,v_birthday) ; --补全3
END;
\set SQLTERM ;
/* 执行存储过程 */
CALL proc_3('0099','曲枫','女','讲师','1994-07-04'); --补全4
第11关:删除存储过程
实验要求
删除存储过程proc_2。
相关知识
删除存储过程
当一个存储过程不会再用到时,可以使用 DROP PROCEDURE 语句执行删除操作。其 语法格式如下:
DROP PROCEDURE ProcedureName [([<ExpressionList>])] [CASCADE | RESTRICT];
其中,各参数的意义如下: ① ProcedureName:需要删除的存储过程名称,可以加模式限定的。 ② ExpressionList:参数表达式列表。因为 KingbaseES 允许存储过程重载,所以当不存 在同名的存储过程时,不需加参数;但如果有同名的存储过程,则需要加参数。 ③ CASCADE:自动删除依赖于要删除的存储过程的对象(如操作符、触发器)。 ④ RESTRICT:若有对象依赖于要删除的存储过程,则拒绝删除它。
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
删除存储过程
当一个存储过程不会再用到时,可以使用 DROP PROCEDURE 语句执行删除操作。其 语法格式如下:
DROP PROCEDURE ProcedureName [([<ExpressionList>])] [CASCADE | RESTRICT];
其中,各参数的意义如下: ① ProcedureName:需要删除的存储过程名称,可以加模式限定的。 ② ExpressionList:参数表达式列表。因为 KingbaseES 允许存储过程重载,所以当不存 在同名的存储过程时,不需加参数;但如果有同名的存储过程,则需要加参数。 ③ CASCADE:自动删除依赖于要删除的存储过程的对象(如操作符、触发器)。 ④ RESTRICT:若有对象依赖于要删除的存储过程,则拒绝删除它。
开始你的任务吧,祝你成功!
---------- BEGIN ----------
DROP PROCEDURE proc_2;
---------- END ----------
第12关:创建触发器 1
实验要求
在 TESTDB 数据库中按要求创建触发器。 1、触发器实现功能:当修改教师授课表中的教室信息后,显示提示信息“XXX班级XXX课程的上课地点发生了变化!”。 2、触发事件:将教师授课表中,G001课程的上课地点改为A102。
相关知识
用 CREATE TRIGGER 命令创建存储过程
触发器又叫做事件–条件–动作(event-condition-action)规则。当特定的系统事件发生 时,对规则的条件进行检查,如果条件成立,就执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段 SQL 存储过程。 创建触发器语句的语法格式如下:
CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}ON table_name[FROM referenced_table_name][NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]][FOR [EACH] {ROW | STATEMENT}][WHEN (condition)]{EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};
其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERT、DELETE、UPDATE 或 TRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLE 、 DEFERRABLE 、 INITIALLY IMMEDIATE 、 INITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments):function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEW 和 OLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEW 或 OLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
用 CREATE TRIGGER 命令创建存储过程
触发器又叫做事件–条件–动作(event-condition-action)规则。当特定的系统事件发生 时,对规则的条件进行检查,如果条件成立,就执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段 SQL 存储过程。 创建触发器语句的语法格式如下:
CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}ON table_name[FROM referenced_table_name][NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]][FOR [EACH] {ROW | STATEMENT}][WHEN (condition)]{EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};
其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERT、DELETE、UPDATE 或 TRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLE 、 DEFERRABLE 、 INITIALLY IMMEDIATE 、 INITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments):function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEW 和 OLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEW 或 OLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。
开始你的任务吧,祝你成功!
/* 自定义触发器:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE TRIGGER tr1
AFTER UPDATE ON teaching --补全1
FOR EACH ROW
AS
BEGIN
RAISE NOTICE '%班级%课程的上课地点发生了变化', new.gno,NEW.cno ; --补全2
END;
\set SQLTERM ;
/* 执行触发事件 */
UPDATE teaching SET classroom='A102' WHERE cno='G001';
第13关:创建触发器 2
实验要求
在 TESTDB 数据库中按要求创建触发器。 1、触发器实现功能:向教师授课表中添加记录时,则显示提示信息“XX教师在XX教室讲授XX课程”。 2、触发事件:向教师授课表中添加两条记录'R003','0193','0211903','2','B001和'S023','0014','0131901','2','S001'。
相关知识
用 CREATE TRIGGER 命令创建存储过程
触发器又叫做事件–条件–动作(event-condition-action)规则。当特定的系统事件发生 时,对规则的条件进行检查,如果条件成立,就执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段 SQL 存储过程。 创建触发器语句的语法格式如下:
CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}ON table_name[FROM referenced_table_name][NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]][FOR [EACH] {ROW | STATEMENT}][WHEN (condition)]{EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};
其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERT、DELETE、UPDATE 或 TRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLE 、 DEFERRABLE 、 INITIALLY IMMEDIATE 、 INITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments):function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEW 和 OLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEW 或 OLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。
实验环境
-
teacher(教师表):
tno(工号) tname(姓名) sex(性别) title(职称) birthday(出生日期) 0014 李欣 男 教授 1969-07-25 0078 张云 女 副教授 1975-11-25 0118 王立 男 高级工程师 1985-04-28 0193 赵玲 女 讲师 1992-09-26 0213 杨梅 女 副教授 1986-06-07 0030 覃刚 男 副教授 1980-02-15 0296 赵梦 女 教授 -
course(课程表):
cno(课程号) cname(课程名) credit(学分) hours(学时) examination(考核方式) G001 线性代数 3 48 考试 R003 数据结构 3 48 考试 R009 离散数学 3 48 考试 S023 嵌入式系统与编程实验 1 32 考察 G012 大学物理 4 64 考试 -
class(班级表):
gno(班级号) gname(班级名) grade(年级) dept(学院) gnum(班级人数) 0211801 软件18级1班 18级 软件 37 0211903 软件19级3班 19级 软件 35 0131901 机械19级1班 19级 机械 37 -
teaching(教师授课表):
cno(课程号) tno(工号) gno(班级号) term(开课学期) classroom(教室) G001 0078 0211903 1 A101 G001 0078 0131901 1 A101 R003 0118 0211801 2 S001 R009 0213 0211903 2 S002 S023 0193 0211801 1 S001 G012 0030 0131901 2 B003
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
用 CREATE TRIGGER 命令创建存储过程
触发器又叫做事件–条件–动作(event-condition-action)规则。当特定的系统事件发生 时,对规则的条件进行检查,如果条件成立,就执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段 SQL 存储过程。 创建触发器语句的语法格式如下:
CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}ON table_name[FROM referenced_table_name][NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]][FOR [EACH] {ROW | STATEMENT}][WHEN (condition)]{EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};
其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERT、DELETE、UPDATE 或 TRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLE 、 DEFERRABLE 、 INITIALLY IMMEDIATE 、 INITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments):function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEW 和 OLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEW 或 OLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。
开始你的任务吧,祝你成功!
/* 自定义触发器:请补全下列PL/SQL语句,不要改动其他代码 */
\set SQLTERM /
CREATE OR REPLACE FUNCTION fun_tr2() RETURNS SETOF teaching --补全1
AS
BEGIN
RAISE NOTICE '%教师在%教室讲授%课程',NEW.tno,NEW.classroom,NEW.cno; --补全2
END;
CREATE TRIGGER tr2
AFTER INSERT ON teaching --补全3
FOR EACH ROW AS BEGIN RAISE NOTICE '%教师在%教室讲授%课程',NEW.tno,NEW.classroom,NEW.cno;
END; --补全4
\set SQLTERM ;
/* 执行触发事件 */
INSERT INTO teaching VALUES ('R003','0193','0211903','2','B001'), ('S023','0014','0131901','2','S001');
第14关:删除触发器
实验要求
删除教师授课表上的触发器tr1。
相关知识
删除触发器
当触发器不需要时,可以使用 DROP TRIGGER 语句将其删除,其语法格式如下:
DROP TRIGGER [IF EXISTS ] name ON table_name [CASCADE | RESTRICT]
其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的触发器不存在时不发出错误信息,而是发出提示。 ② name:要删除的触发器的名称。 ③ table_name:触发器所在表的名称。 ④ CASCADE:自动删除依赖于该触发器的对象,然后删除所有依赖于那些对象的对象。 ⑤ RESTRICT:若有对象依赖于要删除的触发器,则拒绝删除它。此项为默认值
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
相关知识
删除触发器
当触发器不需要时,可以使用 DROP TRIGGER 语句将其删除,其语法格式如下:
DROP TRIGGER [IF EXISTS ] name ON table_name [CASCADE | RESTRICT]
其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的触发器不存在时不发出错误信息,而是发出提示。 ② name:要删除的触发器的名称。 ③ table_name:触发器所在表的名称。 ④ CASCADE:自动删除依赖于该触发器的对象,然后删除所有依赖于那些对象的对象。 ⑤ RESTRICT:若有对象依赖于要删除的触发器,则拒绝删除它。此项为默认值
开始你的任务吧,祝你成功!
---------- BEGIN ----------
DROP TRIGGER tr1 ON teaching;
---------- END ----------
更多推荐




所有评论(0)