第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 流程控制语句

  1. \set SQLTERM/
  2. [DECLARE
  3. declarations] -- 声明部分:在此定义变量、常量、类型、游标等
  4. BEGIN
  5. IF EXISTS(判断条件) -- 执行部分:SQL 语句和 PL/SQL 语句构成的程序的主要部分
  6. THEN
  7. [可执行语句]
  8. END IF;
  9. END; -- 标记程序体部分结束
  10. /

简单循环 LOOP

简单循环使程序不经过判断就进入循环,在循环体中判断条件是否满足,一旦满足条件,立即退出循环。简单循环 LOOP 的基本语法格式如下:

  1. LOOP
  2. <循环体> /* 执行循环体 */
  3. IF <条件表达式> THEN /* 测试条件表达式是否符合退出条件 */
  4. EXIT; /* 满足退出条件,退出循环 */
  5. END IF;
  6. END LOOP;

注意: 在简单循环中,如果不人为控制,循环体将会无限执行,一般可通过加入 EXIT 语 句来终止循环。多数数据库管理系统的过程化 SQL 都提供 EXITBREAKLEAVE 等循环 结束语句,保证 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 流程控制语句

  1. \set SQLTERM/
  2. [DECLARE
  3. declarations] -- 声明部分:在此定义变量、常量、类型、游标等
  4. BEGIN
  5. IF EXISTS(判断条件) -- 执行部分:SQL 语句和 PL/SQL 语句构成的程序的主要部分
  6. THEN
  7. [可执行语句]
  8. END IF;
  9. END; -- 标记程序体部分结束
  10. /

简单循环 LOOP

简单循环使程序不经过判断就进入循环,在循环体中判断条件是否满足,一旦满足条件,立即退出循环。简单循环 LOOP 的基本语法格式如下:

  1. LOOP
  2. <循环体> /* 执行循环体 */
  3. IF <条件表达式> THEN /* 测试条件表达式是否符合退出条件 */
  4. EXIT; /* 满足退出条件,退出循环 */
  5. END IF;
  6. END LOOP;

注意:

在简单循环中,如果不人为控制,循环体将会无限执行,一般可通过加入 EXIT 语 句来终止循环。多数数据库管理系统的过程化 SQL 都提供 EXITBREAKLEAVE 等循环 结束语句,保证 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 ,语句的语法格式如下:
    
      
    1. CASE search-expression
    2. WHEN expression [, expression [ …]] THEN
    3. statements
    4. [WHEN expression [, expression [ …]] THEN
    5. statements
    6. …]
    7. [ELSE
    8. statements]
    9. END CASE;
    CASE 的简单形式提供了基于操作数等值判断的有条件执行。
    执行过程:search-expression会被计算(一次)且一个接一个地与 WHEN 子句中的每个 expression 比较。
    • 如果找到一个匹配,那么相应的 statements 会被执行,并且接着控制会交给 END CASE 后的下一个语句(后续的 WHEN 表达式不会被计算)。
  • 如果没有找到匹配项,那么 ELSE 语句会被执行。但是如果 ELSE 不存在会报错。
  • 搜索 CASE ,语句的语法格式如下:
    
      
    1. CASE
    2. WHEN boolean-expression THEN
    3. statements
    4. [WHEN boolean-expression THEN
    5. statements
    6. ]
    7. [ELSE
    8. statements]
    9. 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 ,语句的语法格式如下:
    
      
    1. CASE search-expression
    2. WHEN expression [, expression [ …]] THEN
    3. statements
    4. [WHEN expression [, expression [ …]] THEN
    5. statements
    6. …]
    7. [ELSE
    8. statements]
    9. END CASE;
    CASE 的简单形式提供了基于操作数等值判断的有条件执行。
    执行过程:search-expression会被计算(一次)且一个接一个地与 WHEN 子句中的每个 expression 比较。
    • 如果找到一个匹配,那么相应的 statements 会被执行,并且接着控制会交给 END CASE 后的下一个语句(后续的 WHEN 表达式不会被计算)。
  • 如果没有找到匹配项,那么 ELSE 语句会被执行。但是如果 ELSE 不存在会报错。
  • 搜索 CASE ,语句的语法格式如下:
    
      
    1. CASE
    2. WHEN boolean-expression THEN
    3. statements
    4. [WHEN boolean-expression THEN
    5. statements
    6. ]
    7. [ELSE
    8. statements]
    9. 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 循环的基本语法格式如下:


  1. [<<label>>]
  2. FOR name IN [REVERSE] expression1..expression2 [BY expression] LOOP
  3. statements
  4. END 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 循环的基本语法格式如下:


  1. [<<label>>]
  2. FOR name IN [REVERSE] expression1..expression2 [BY expression] LOOP
  3. statements
  4. END 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、调用函数:显示职称为教授的教师信息。

相关知识

创建自定义函数

创建自定义函数的语法格式如下:


  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)
  2. RETURNS return_datatype AS
  3. DECLARE
  4. declaration;
  5. […]
  6. BEGIN
  7. <function_body>
  8. […]
  9. RETURN {variable_name | value}
  10. 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

测试说明

平台会对你编写的代码进行测试,结果正确即可通关。

相关知识

创建自定义函数

创建自定义函数的语法格式如下:


  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)
  2. RETURNS return_datatype AS
  3. DECLARE
  4. declaration;
  5. […]
  6. BEGIN
  7. <function_body>
  8. […]
  9. RETURN {variable_name | value}
  10. 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级的班级信息。

相关知识

创建自定义函数

创建自定义函数的语法格式如下:


  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)
  2. RETURNS return_datatype AS
  3. DECLARE
  4. declaration;
  5. […]
  6. BEGIN
  7. <function_body>
  8. […]
  9. RETURN {variable_name | value}
  10. 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

测试说明

平台会对你编写的代码进行测试,结果正确即可通关。

相关知识

创建自定义函数

创建自定义函数的语法格式如下:


  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)
  2. RETURNS return_datatype AS
  3. DECLARE
  4. declaration;
  5. […]
  6. BEGIN
  7. <function_body>
  8. […]
  9. RETURN {variable_name | value}
  10. 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'的插入。

相关知识

创建自定义函数

创建自定义函数的语法格式如下:


  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)
  2. RETURNS return_datatype AS
  3. DECLARE
  4. declaration;
  5. […]
  6. BEGIN
  7. <function_body>
  8. […]
  9. RETURN {variable_name | value}
  10. 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

测试说明

平台会对你编写的代码进行测试,结果正确即可通关。

相关知识

创建自定义函数

创建自定义函数的语法格式如下:


  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)
  2. RETURNS return_datatype AS
  3. DECLARE
  4. declaration;
  5. […]
  6. BEGIN
  7. <function_body>
  8. […]
  9. RETURN {variable_name | value}
  10. 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 语句执行删除操作,语法格式如下:


  1. DROP FUNCTION [IF EXISTS ] name ([[argmode] [argname] argtype, …]]) [CASCADE | RESTRICT]

其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的函数不存在时不发出错误信息,而是发出一个提示。 ② name:需要删除的函数名称,可以加模式限定。 ③ argmode:参数的模式,有 INOUTINOUT 等。若省略,则默认为 IN。 ④ argname:参数的名称。 ⑤ argtype:函数若有参数,代表函数参数的数据类型。 ⑥ CASCADE:自动删除依赖于要删除的函数的对象(如操作符、触发器),然后删除所 有依赖于那些对象的对象。 ⑦ RESTRICT:若有对象依赖于要删除的函数,则拒绝删除它。默认为 RESTRICT

测试说明

平台会对你编写的代码进行测试,结果正确即可通关。

相关知识

删除函数

当一个函数不会再用到时,可以使用 DROP FUNCTION 语句执行删除操作,语法格式如下:


  1. DROP FUNCTION [IF EXISTS ] name ([[argmode] [argname] argtype, …]]) [CASCADE | RESTRICT]

其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的函数不存在时不发出错误信息,而是发出一个提示。 ② name:需要删除的函数名称,可以加模式限定。 ③ argmode:参数的模式,有 INOUTINOUT 等。若省略,则默认为 IN。 ④ argname:参数的名称。 ⑤ argtype:函数若有参数,代表函数参数的数据类型。 ⑥ CASCADE:自动删除依赖于要删除的函数的对象(如操作符、触发器),然后删除所 有依赖于那些对象的对象。 ⑦ RESTRICT:若有对象依赖于要删除的函数,则拒绝删除它。默认为 RESTRICT


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

---------- BEGIN ---------- 
DROP FUNCTION fun1;


---------- END ---------- 

第8关:创建存储过程 1


实验要求

TESTDB 数据库中按要求创建存储过程。 1、存储过程实现功能:能够根据职称,查询所属该职称的教师信息。 2、执行存储过程:显示职称为教授的教师信息。

相关知识

用 CREATE PROCEDURE 命令创建存储过程

当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:


  1. CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]
  2. {AS |IS}
  3. [LabelName]
  4. [DECLARE]
  5. [说明部分]
  6. BEGIN
  7. 语句序列
  8. [EXCEPTION 出错处理]
  9. END [LabelName];

其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 ISAS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:INOUTINOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUTINOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUTINOUT 参数声明的顺序。

游标

1.声明游标

游标在存储过程的声明部分定义。具体方法有如下两种。 (1) 在存储过程中声明游标: 游标名 refcursor; 其中,“游标名”是一个标识符,只被用来对相应的查询进行引用,不可为游标名赋值,也不可将其用于表达式。refcursor 是预定义的 cursor 类型,这个类型允许用户定义 CURSOR,允许运行时为其指定不同的 SQL。此时,游标还没有绑定查询语句,因此游标不能访问。 (2) 使用游标专有声明:


  1. CURSOR 游标名[(arguments)] FOR query;

其中,各参数的意义如下。 ① arguments 为由“,”分隔的参数列表,可以带一个或多个参数,用于打开游标时向游 标传递参数,与存储过程或函数的形式参数类似;打开带参数的游标时,在 OPEN 后的括号内标明实际参数。注意,实际参数的个数及类型必须与游标定义中的形式参数相匹配。 ② query 是由 SELECT 引出的数据查询语句,返回的值存储在游标中。 声明游标的示例,例如:


  1. CURSOR curS FOR SELECT * FROM S;
  2. CURSOR curST(mykey integer) FOR SELECT * FROM S WHERE sno = mykey;

2.打开游标

对应打开游标有 3 种方式。打开游标需要使用 OPEN 语句。 ① 打开未绑定的游标 OPEN FOR 方式,其语法格式如下:


  1. OPEN unbound_cursor FOR query;

其中,unbound_ cursor 为游标,打开未绑定的游标,其 query 查询语句是返回记录的 SELECT语句。例如:


  1. OPEN curVars1 FOR SELECT * FROM S WHERE sno = myno;

② 打开未绑定的游标 OPEN FOR EXECUTE 方式,其语法格式如下:


  1. OPEN unbound_cursor FOR EXECUTE query-string;

其中,EXECUTE 将动态执行查询字符串。例如:


  1. OPEN curVars1 FOR EXECUTE 'SELECT * FROM' || quote_idt($1);

注意:“$1”是指由存储过程传递的第 1 个参数。 ③ 打开一个绑定的游标,其语法格式如下:


  1. OPEN bound_cursor [(argument_values)];

此形式仅适用于绑定的游标,只有当该游标在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中。例如:


  1. OPEN curS;
  2. OPEN curST('2501105');

3.使用游标

为了处理结果集中的数据,需要检索游标。这需要使用 FETCH 语句,其语法格式如下:


  1. FETCH cursor INTO target;

其中,FETCH 命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过游标属 性“游标名%FOUND”来判断。“%FOUND”用于判断游标是否找到记录,若找到记录,则返回值为 TRUE。用 FETCH 语句提取游标数据,“%NOTFOUND”与“%FOUND”属性恰好相反,若检索到数据,则返回值为 FALSE,否则返回值为 TRUE。例如:


  1. FETCH curVars1 INTO rowvar; -- rowvar 为行变量
  2. FETCH curST INTO V_sno, V_sn, V_sex;

注意:① 游标的属性列必须与目标列的数量一致,并且类型兼容;② 变量的个数、顺序及类型要与游标中相应字段保持一致。

4.关闭游标

关闭游标需要使用 CLOSE 语句。其语法格式如下:


  1. CLOSE cursorName;

其中,cursorName 为游标名。例如:


  1. 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 命令创建存储过程

当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:


  1. CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]
  2. {AS |IS}
  3. [LabelName]
  4. [DECLARE]
  5. [说明部分]
  6. BEGIN
  7. 语句序列
  8. [EXCEPTION 出错处理]
  9. END [LabelName];

其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 ISAS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:INOUTINOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUTINOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUTINOUT 参数声明的顺序。


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

/* 自定义存储过程:请补全下列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 命令创建存储过程

当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:


  1. CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]
  2. {AS |IS}
  3. [LabelName]
  4. [DECLARE]
  5. [说明部分]
  6. BEGIN
  7. 语句序列
  8. [EXCEPTION 出错处理]
  9. END [LabelName];

其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 ISAS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:INOUTINOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUTINOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUTINOUT 参数声明的顺序。

游标

1.声明游标

游标在存储过程的声明部分定义。具体方法有如下两种。 (1) 在存储过程中声明游标: 游标名 refcursor; 其中,“游标名”是一个标识符,只被用来对相应的查询进行引用,不可为游标名赋值,也不可将其用于表达式。refcursor 是预定义的 cursor 类型,这个类型允许用户定义 CURSOR,允许运行时为其指定不同的 SQL。此时,游标还没有绑定查询语句,因此游标不能访问。 (2) 使用游标专有声明:


  1. CURSOR 游标名[(arguments)] FOR query;

其中,各参数的意义如下。 ① arguments 为由“,”分隔的参数列表,可以带一个或多个参数,用于打开游标时向游 标传递参数,与存储过程或函数的形式参数类似;打开带参数的游标时,在 OPEN 后的括号内标明实际参数。注意,实际参数的个数及类型必须与游标定义中的形式参数相匹配。 ② query 是由 SELECT 引出的数据查询语句,返回的值存储在游标中。 声明游标的示例,例如:


  1. CURSOR curS FOR SELECT * FROM S;
  2. CURSOR curST(mykey integer) FOR SELECT * FROM S WHERE sno = mykey;

2.打开游标

对应打开游标有 3 种方式。打开游标需要使用 OPEN 语句。 ① 打开未绑定的游标 OPEN FOR 方式,其语法格式如下:


  1. OPEN unbound_cursor FOR query;

其中,unbound_ cursor 为游标,打开未绑定的游标,其 query 查询语句是返回记录的 SELECT语句。例如:


  1. OPEN curVars1 FOR SELECT * FROM S WHERE sno = myno;

② 打开未绑定的游标 OPEN FOR EXECUTE 方式,其语法格式如下:


  1. OPEN unbound_cursor FOR EXECUTE query-string;

其中,EXECUTE 将动态执行查询字符串。例如:


  1. OPEN curVars1 FOR EXECUTE 'SELECT * FROM' || quote_idt($1);

注意:“$1”是指由存储过程传递的第 1 个参数。 ③ 打开一个绑定的游标,其语法格式如下:


  1. OPEN bound_cursor [(argument_values)];

此形式仅适用于绑定的游标,只有当该游标在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中。例如:


  1. OPEN curS;
  2. OPEN curST('2501105');

3.使用游标

为了处理结果集中的数据,需要检索游标。这需要使用 FETCH 语句,其语法格式如下:


  1. FETCH cursor INTO target;

其中,FETCH 命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过游标属 性“游标名%FOUND”来判断。“%FOUND”用于判断游标是否找到记录,若找到记录,则返回值为 TRUE。用 FETCH 语句提取游标数据,“%NOTFOUND”与“%FOUND”属性恰好相反,若检索到数据,则返回值为 FALSE,否则返回值为 TRUE。例如:


  1. FETCH curVars1 INTO rowvar; -- rowvar 为行变量
  2. FETCH curST INTO V_sno, V_sn, V_sex;

注意:① 游标的属性列必须与目标列的数量一致,并且类型兼容;② 变量的个数、顺序及类型要与游标中相应字段保持一致。

4.关闭游标

关闭游标需要使用 CLOSE 语句。其语法格式如下:


  1. CLOSE cursorName;

其中,cursorName 为游标名。例如:


  1. 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 命令创建存储过程

当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:


  1. CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]
  2. {AS |IS}
  3. [LabelName]
  4. [DECLARE]
  5. [说明部分]
  6. BEGIN
  7. 语句序列
  8. [EXCEPTION 出错处理]
  9. END [LabelName];

其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 ISAS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:INOUTINOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUTINOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUTINOUT 参数声明的顺序。


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

/* 自定义存储过程:请补全下列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 命令创建存储过程

当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:


  1. CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]
  2. {AS |IS}
  3. [LabelName]
  4. [DECLARE]
  5. [说明部分]
  6. BEGIN
  7. 语句序列
  8. [EXCEPTION 出错处理]
  9. END [LabelName];

其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 ISAS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:INOUTINOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUTINOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUTINOUT 参数声明的顺序。

实验环境

  • 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 命令创建存储过程

当创建存储过程时,需要确定存储过程的三个组成部分。 ① 所有的输入参数以及传给调用者的输出参数。 ② 被执行的针对数据库的操作语句,包括调用其他存储过程的语句。 ③ 返回给调用者的状态值以指明调用是成功还是失败。 创建存储过程语句的语法格式如下:


  1. CREATE [OR REPLACE] PROCEDURE 过程名 [([IN | OUT | INOUT]参数名 数据类型, …)]
  2. {AS |IS}
  3. [LabelName]
  4. [DECLARE]
  5. [说明部分]
  6. BEGIN
  7. 语句序列
  8. [EXCEPTION 出错处理]
  9. END [LabelName];

其中,各参数的意义说明如下 ① 过程名和参数名必须符合标识符命名规则。 ② OR REPLACE 是一个可选的关键字,建议用户使用此关键字,当数据库中已经存在 此过程名,则该过程会被重新定义,并被替换。 ③ 关键字 ISAS 没有区别,选择其中一个即可。IS 后是一个完整的 PL/SQL 程序块, 可以定义变量、游标等。 使用参数和返回值时需注意:创建存储过程时可以定义零至多个形式参数。形式参数可以有 3 种模式:INOUTINOUT。如未给形式参数指定模式,默认为 IN。 ① 如果只有一个 OUT 参数,其返回值类型与 OUT 参数返回值类型必须一致;如果有多个 OUT 或者 INOUT 参数,则返回结果值必须是 RECORD 类型。 ② 如果有 OUTINOUT 参数,运行所得是一个结果集,结果集由一条或多条 RECORD 组成,则每条 RECORD 中,字段的顺序按 OUTINOUT 参数声明的顺序。


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

/* 自定义存储过程:请补全下列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 语句执行删除操作。其 语法格式如下:


  1. DROP PROCEDURE ProcedureName [([<ExpressionList>])] [CASCADE | RESTRICT];

其中,各参数的意义如下: ① ProcedureName:需要删除的存储过程名称,可以加模式限定的。 ② ExpressionList:参数表达式列表。因为 KingbaseES 允许存储过程重载,所以当不存 在同名的存储过程时,不需加参数;但如果有同名的存储过程,则需要加参数。 ③ CASCADE:自动删除依赖于要删除的存储过程的对象(如操作符、触发器)。 ④ RESTRICT:若有对象依赖于要删除的存储过程,则拒绝删除它。

测试说明

平台会对你编写的代码进行测试,结果正确即可通关。

相关知识

删除存储过程

当一个存储过程不会再用到时,可以使用 DROP PROCEDURE 语句执行删除操作。其 语法格式如下:


  1. 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 存储过程。 创建触发器语句的语法格式如下:


  1. CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}
  2. ON table_name
  3. [FROM referenced_table_name]
  4. [NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]]
  5. [FOR [EACH] {ROW | STATEMENT}]
  6. [WHEN (condition)]
  7. {EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};

其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERTDELETEUPDATETRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLEDEFERRABLEINITIALLY IMMEDIATEINITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments)function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEWOLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEWOLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。

实验环境

  • 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 存储过程。 创建触发器语句的语法格式如下:


  1. CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}
  2. ON table_name
  3. [FROM referenced_table_name]
  4. [NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]]
  5. [FOR [EACH] {ROW | STATEMENT}]
  6. [WHEN (condition)]
  7. {EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};

其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERTDELETEUPDATETRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLEDEFERRABLEINITIALLY IMMEDIATEINITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments)function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEWOLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEWOLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。


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

/* 自定义触发器:请补全下列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 存储过程。 创建触发器语句的语法格式如下:


  1. CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}
  2. ON table_name
  3. [FROM referenced_table_name]
  4. [NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]]
  5. [FOR [EACH] {ROW | STATEMENT}]
  6. [WHEN (condition)]
  7. {EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};

其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERTDELETEUPDATETRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLEDEFERRABLEINITIALLY IMMEDIATEINITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments)function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEWOLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEWOLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。

实验环境

  • 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 存储过程。 创建触发器语句的语法格式如下:


  1. CREATE [OR REPLACE][CONSTRAINT] TRIGGER name {BEFORE | AFTER | INSTEAD OF} {event [OR …]}
  2. ON table_name
  3. [FROM referenced_table_name]
  4. [NOT DEFERRABLE | [DEFERRABLE] [INITIALLY IMMEDIATE | INITIALLY DEFERRED]]
  5. [FOR [EACH] {ROW | STATEMENT}]
  6. [WHEN (condition)]
  7. {EXECUTE PROCEDURE function_name (arguments) | {AS | IS} <PlsqlBlock>};

其中,各参数说明如下。 ① 表的拥有者才可以在表上创建触发器。 ② name:触发器名,可以包含模式名,也可以不包含模式名,在同一模式下,触发器名 必须是唯一的。触发器名和表名必须在同一模式下。 ③ table_name:表名,当基本表的数据发生变化时,将激活定义在该表上相应触发事件 的触发器。referenced_table_name 为约束引用的另一个表的名称。 ④ event:触发事件,可以是 INSERTDELETEUPDATETRUNCATE,还可以 UPDATE OF<触发列, …>,即进一步指明修改哪些列时激活触发器。AFTER/BEFORE 是触发的时机,AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行 之前激活触发器。 ⑤ NOT DEFERRABLEDEFERRABLEINITIALLY IMMEDIATEINITIALLY DEFERRED:触发器的默认时机。 ⑥ 触发器类型:行级触发器(FOR EACH ROW)、语句级触发器(FOR EACH STATEMENT)。 ⑦ condition:触发条件,触发器被激活时,只有当触发条件为真时触发动作体才执行; 否则不执行。如果省略 WHEN 触发条件,那么触发动作体在触发器激活后立即执行。 ⑧ function_name(arguments)function name 为用户提供的函数名,当触发器触发时会执 行该函数,该函数被声明为不用参数并且返回类型为 trigger 的函数。Arguments 为一个可选的逗号分隔的参数列表,在该触发器被执行时会被提供给该函数。简单的名称和数字常量也可以被写在这里,但是它们将全部被转换成字符串。 ⑨ 触发动作体:可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。 注意: ① 如果是行级触发器,用户可以在过程体中使用 NEWOLD 引用事件后的新值和事件前的旧值;如果是语句级触发器,就不能在触发动作体中使用 NEWOLD 进行引用。 ② 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发 器可能影响的其他对象不发生任何变化。 ③ 不同的关系数据库管理系统产品,触发器语法各不相同。


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

/* 自定义触发器:请补全下列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 语句将其删除,其语法格式如下:


  1. DROP TRIGGER [IF EXISTS ] name ON table_name [CASCADE | RESTRICT]

其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的触发器不存在时不发出错误信息,而是发出提示。 ② name:要删除的触发器的名称。 ③ table_name:触发器所在表的名称。 ④ CASCADE:自动删除依赖于该触发器的对象,然后删除所有依赖于那些对象的对象。 ⑤ RESTRICT:若有对象依赖于要删除的触发器,则拒绝删除它。此项为默认值

测试说明

平台会对你编写的代码进行测试,结果正确即可通关。

相关知识

删除触发器

当触发器不需要时,可以使用 DROP TRIGGER 语句将其删除,其语法格式如下:


  1. DROP TRIGGER [IF EXISTS ] name ON table_name [CASCADE | RESTRICT]

其中,各参数的意义如下。 ① IF EXISTS:选择此项,则指定的触发器不存在时不发出错误信息,而是发出提示。 ② name:要删除的触发器的名称。 ③ table_name:触发器所在表的名称。 ④ CASCADE:自动删除依赖于该触发器的对象,然后删除所有依赖于那些对象的对象。 ⑤ RESTRICT:若有对象依赖于要删除的触发器,则拒绝删除它。此项为默认值


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

---------- BEGIN ---------- 
DROP TRIGGER tr1 ON teaching;

---------- END ---------- 

Logo

一站式 AI 云服务平台

更多推荐