数据表的构建

请创建学生信息表、成绩信息表、课程信息表、班级信息表,要求:

1.1学生信息表需要包含学号(主键),学生姓名(非空),性别(非空,且只能填写“男或女”),班级编号(外键,关联班级信息表)

1.2 成绩信息表需要包含成绩编号(主键),学号(外键,关联学生信息表),课程编号(外键,关联课程信息表),成绩得分(非空,不能填写负数),成绩录入日期(默认值当前日期)

1.3 课程信息表需要包含课程编号(主键),课程名称(非空),课程类型(非空,且只能填写“必修或选修”)

1.4 班级信息表需要包含班级编号(主键),班级名称(非空)

CREATE TABLE student (
  student_id VARCHAR(20) NOT NULL PRIMARY KEY,
  student_name VARCHAR(20) NOT NULL,
  gender VARCHAR2(2) CHECK( gender =' 男 ' OR gender =' 女 '),
  class_id VARCHAR(20) NOT NULL,
  FOREIGN KEY (class_id) REFERENCES class(class_id)
);


CREATE TABLE score(
score_id VARCHAR(20) NOT NULL PRIMARY KEY, 
student_id VARCHAR(20) NOT NULL, 
course_id VARCHAR(20) NOT NULL, 
score DECIMAL(5,2) NOT NULL, 
CONSTRAINT chk_score CHECK (score >= 0),
entry_date DATE DEFAULT CURRENT_DATE, 
FOREIGN KEY(student_id) REFERENCES student(student_id), 
FOREIGN KEY(course_id) REFERENCES course(course_id)
);

CREATE TABLE course(
course_id VARCHAR(20) NOT NULL PRIMARY KEY, 
course_name VARCHAR(20) NOT NULL, 
course_type VARCHAR(10) NOT NULL,
CONSTRAINT chk_course_type CHECK (course_type IN ('必修', '选修'))
);

CREATE TABLE class(
class_id VARCHAR(20) NOT NULL PRIMARY KEY, 
class_name VARCHAR(20) NOT NULL
);

------------------------------------------------数据库架构-----------------------------------------------------------------

PL/SQL 的基本构成
PL/SQL 语言是 SQL 语言的扩展,具有为程序开发而设计的特性,如数据封装、异常处理、面向对象等特性。PL/SQL 是嵌入到 Oracle服务器和开发工具中的,所以具有很高的执行效率和同Oracle 数据库的完美结合。在PL/SQL 模块中可以使用查询语句和数据操纵语句 ( 即进行DML 操作 ) ,这样就可以编写具有数据库事务处理功能的模块。

至于数据定义 (DDL) 和数据控制 (DCL) 命令的处理,需要通过Oracle提供的特殊的 DBMS_SQL 包来进行。 PL/SQL 还可以用来编写过程、函数、包及数据库触发器。过程和函数也称为子程序,在定义时要给出相应的过程名和函数名。它们可以存储在数据库中成为存储过程和存储函数,并可以由程序来调用,它们在结构上同程序模块类似。
PL/SQL过程化结构的特点是:可将逻辑上相关的语句组织在一个程序块内;通过嵌入或调用子块,构造功能强大的程序;可将一个复杂的问题分解成为一组便于管理、定义和实现的小块。

PL/SQL程序的基本单元是块(BLOCK),块就是实现一定功能的逻辑模块。一个PL/SQL程序由一个或多个块组成。块有固定的结构,也可以嵌套。一个块可以包括三个部分,每个部分由一个关键字标识。块中各部分的作用解释如下:

(1) DECLARE:声明部分标志。

(2) BEGIN:可执行部分标志。

(3) EXCEPTION:异常处理部分标志。

(4) END;:程序结束标志。

将使用函数DBMS_OUTPUT.PUT_LINE显示输出结果。DBMS_OUTPUTOracle提供的包,该包有如下三个用于输出的函数,用于显示PL/SQL程序模块的输出信息。

第一种形式: DBMS_OUTPUT.PUT(字符串表达式)

用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。

第二种形式: DBMS_OUTPUT.PUT_LINE(字符串表达式)

用于输出一行字符串信息,并换行,括号中的参数是要输出的字符串表达式。

第三种形式: DBMS_OUTPUT.NEW_LINE;        --put一定要换行,不然显示不出来

用来输出一个换行,没有参数。调用函数时,在包名后面用一个点.”和函数名分隔,表示隶属关系。

要使用该方法显示输出数据,在SQL*Plus环境下要先执行一次如下的环境设置命令:

SET SERVEROUTPUT ON [SIZE n]

用来打开DBMS_OUTPUT.PUT_LINE函数的屏幕输出功能,系统默认状态是OFF。其中,n表示输出缓冲区的大小。n的范围在20001 000000之间,默认为2000。如果输出内容较多,需要使用SIZE n来设置较大的输出缓冲区。

在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),所以PL/SQL程序是同SQL语言紧密结合在一起的。在PL/SQL程序中,最常见的是使用SELECT语句从数据库中获取信息,同直接执行SELECT语句不同,在程序中的SELECT语句总是和INTO相配合,INTO后跟用于接收查询结果的变量,形式如下:

SELECT 列名1,列名2... INTO 变量1,变量2... FROM 表名 WHERE 条件;

注意:接收查询结果的变量类型、顺序和个数同SELECT语句的字段的类型、顺序和个数应该完全一致。并且SELECT语句返回的数据必须是一行,否则将引发系统错误。当程序要接收返回的多行结果时,可以采用后面介绍的游标的方法。

使用INSERT、DELETE和UPDATE的语法没有变化,但在程序中要注意判断语句执行的状态,并使用COMMITROLLBACK进行事务处理。以下训练包含了按照标准结构书写的一个包含SELECT语句的PL/SQL程序示例。

【训练1】 查询雇员编号为7788的雇员姓名和工资。

DECLARE--定义部分标识
v_name VARCHAR2(10);--定义字符串变量v_name
v_sal NUMBER(5);--定义数值变量v_sal
BEGIN
  SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=7788;--在程序中插入的SQL语句
  DBMS_OUTPUT.PUT_LINE('7788号雇员是: '||v_name||' ,工资为: '||to_char(v_sal));--输出雇员名和工资
END;--结束标识

结果是: 7788号雇员是:SCOTT,工资为:4000

PL/SQL和SQL两者究竟有什么区别呢?SQL查询的方法,只限于SQL环境,并且输出的格式基本上是固定的。而程序通过把数据取到变量中,可以进行复杂的处理,完成SQL语句不能实现的功能,并通过多种方式输出。以分号结束

“--”是注释符号      /*......*/中间也是注释部分,同“--”注释方法不同,它可以跨越多行进行注

变量的基本数据类型同SQL部分的字段数据类型相一致,但是也有不同

 

 VARCHAR2是可变长度的字符串,定义时指明最大长度,存储数据的长度是在最大长度的范围自动调节的,数据前后的空格,Oracle 9i会自动将其删去。

NUMBER型可以定义数值的总长度和小数位,如NUMBER(10,3)表示定义一个宽度为10、小数位为3的数值。整个宽度减去小数部分的宽度为整数部分的宽度,所以整数部分的宽度为7

CHAR数据类型为固定长度的字符串,定义时要指明宽度,如不指明,默认宽度为1。定长字符串在显示输出时,有对齐的效果。

DATE类型用于存储日期数据,内部使用7个字节。其中包括年、月、日、小时、分钟和秒数。默认的格式为DD-MON-YY,如:07-8月-03表示200387日。

BOOLEAN为布尔型,用于存储逻辑值,可用于PL/SQL的控制结构。

LOB数据类型可以存储视频、音频或图片,支持随机访问,存储的数据可以位于数据库内或数据库外,具体有四种类型:BFILE、BLOB、CLOBNCLOB。但是操纵大对象需要使用Oracle提供的DBMS_LOB包。

-----------------------------------------------------变量定义--------------------------------------------------

变量的作用是用来存储数据,可以在过程语句中使用。变量在声明部分可以进行初始化,即赋予初值。变量在定义的同时也可以将其说明成常量并赋予固定的值。变量的命名规则是:以字母开头,后跟其他的字符序列,字符序列中可以包含字母、数值、下划线等符号,最大长度为30个字符,不区分大小写。不能使用Oracle的保留字作为变量名。变量名不要和在程序中引用的字段名相重,如果相重,变量名会被当作列名来使用。

变量的作用范围是在定义此变量的程序范围内,如果程序包含子块,则变量在子块中也有效。但在子块中定义的变量,仅定义变量的子块中有效,在主程序中无效

变量定义的方法是: 变量名 [CONSTANT] 类型标识符 [NOT NULL][:=值|DEFAULT 值];

关键字CONSTANT用来说明定义的变量是常量,如果是常量,必须有赋值部分进行赋值。

关键值NOT NULL用来说明变量不能为空。

=DEFAULT用来为变量赋初值。

变量可以在程序中使用赋值语句重新赋值。通过输出语句可以查看变量的值。

变量名:=值 或 PL/SQL 表达式;

【训练2 】 变量的定义和初始化。
DECLARE--声明部分标识
v_job VARCHAR2(9);
v_count BINARY_INTEGER DEFAULT 0;
v_total_sal NUMBER(9,2) := 0;
v_date DATE := SYSDATE + 7;
c_tax_rate CONSTANT NUMBER(3,2) := 8.25;
v_valid BOOLEAN NOT NULL := TRUE;
BEGIN
v_job:='MANAGER';--在程序中赋值
DBMS_OUTPUT.PUT_LINE(v_job);--输出变量v_job的值
DBMS_OUTPUT.PUT_LINE(v_count);--输出变量v_count的值
DBMS_OUTPUT.PUT_LINE(v_date);--输出变量v_date的值
DBMS_OUTPUT.PUT_LINE(c_tax_rate);--输出变量c_tax_rate的值
END;

执行结果:

MANAGER
0
11-8月 -23
8.25

本训练共定义了6个变量,分别用“:=”赋值运算符或DEFAULT 关键字对变量进行了初始化或赋值。其中:c_tax_rate为常量,在数据类型前加了 “CONSTANT关键字;v_valid变量在赋值运算符前面加了关键字“NOT NULL,强制不能为空。如果变量是布尔型,它的值只能是“TRUE、 “FALSE或“NULL。本练习中的变量v_valid布尔变量的值只能取“TRUE或“FALSE

----------------------------------------根据表的字段定义变量-----------------------------------------------------
变量的声明还可以根据数据库表的字段进行定义或根据已经定义的变量进行定义。方法是在表的字段名或已经定义的变量名后加%TYPE,将其当作数据类型。定义字段变量的方法如下:变量名 表名. 字段名 %TYPE;
【训练3 】 根据表的字段定义变量。
DECLARE
v_ename emp.ename%TYPE;--根据字段定义变量
BEGIN
SELECT ename
INTO v_ename
FROM emp
WHERE empno = 7788;
DBMS_OUTPUT.PUT_LINE(v_ename);
END;

结果为:SCOTT

变量 v_ename 是根据表 emp ename 字段定义的,两者的数据类型总是一致的。
如果我们根据数据库的字段定义了某一变量,后来数据库的字段数据类型又进行了修改,那么 程序中的该变量的定义也自动使用新的数据类型 。使用该种变量定义方法,变量的数据类型和大小是在编译执行时决定的,这为书写和维护程序提供了很大的便利。
---------------------------------------结合变量的定义和使用--------------------------------------------
我们还可以定义 SQL*Plus 环境下使用的变量,称为结合变量。结合变量也可以在程序中使用, 该变量是在整个 SQL*Plus 环境下有效的变量,在退出SQL*Plus 之前始终有效 ,所以可以使用该变量在不同的程序之间传递信息。结合变量不是由程序定义的,而是使用系统命令VARIABLE 定义的。在 SQL*Plus 环境下显示该变量要用系统的PRINT 命令。
VARIABLE 变量名 数据类型
【训练4 】 定义并使用结合变量。
DECLARE
  g_ename VARCHAR2(100) := ''; -- 定义并初始化结合变量g_ename:
BEGIN
  g_ename:= g_ename || 'Hello~ '; -- 在程序中使用结合变量
  DBMS_OUTPUT.PUT_LINE(g_ename); -- 输出结合变量的值
END;

/*VARIABLE g_ename VARCHAR2(100)

BEGIN

:g_ename:=:g_ename|| 'Hello~ '; --在程序中使用结合变量

DBMS_OUTPUT.PUT_LINE(:g_ename); --输出结合变量的值

END;*/

结果:Hello~

g_ename 为结合变量,可以在程序中引用或赋值,引用时在结合变量前面要加上“∶ ”。在程序结束后该变量的值仍然存在,其他程序可以继续引用。
---------------------------------------------记录变量的定义---------------------------------------------------
还可以根据表或视图的一个记录中的所有字段定义变量,称为记录变量。记录变量包含若干个字段,在结构上同表的一个记录相同,定义方法是在表名后跟 %ROWTYPE 。记录变量的字段名就是表的字段名,数据类型也一致。
记录变量的定义方法是:
记录变量名 表名 %ROWTYPE
获 得 记 录 变 量 的 字 段 的 方 法 是 : 记 录 变 量 名 . 字 段 名 , 如 emp_record.ename。
【训练5 】 根据表定义记录变量。
 
DECLARE
emp_record emp%ROWTYPE;--定义记录变量
BEGIN
SELECT * INTO emp_record
FROM emp
WHERE empno = 7788;--取出一条记录
DBMS_OUTPUT.PUT_LINE(emp_record.ename);--输出记录变量的某个字段
END;

结果为: SCOTT

在以上的练习中定义了记录变量emp_record ,它是根据表emp的全部字段定义的。 SELECT 语句将编号为 7788 的雇员的全部字段对应地存入该记录变量,最后输出记录变量的雇员名称字段 emp_record.ename的内容。如果要获得其他字段的内容,比如要获得编号为7788 的雇员的工资可以通过变量 emp_record.sal 获得,依此类推。
----------------------------------------TABLE 类型变量---------------------------------------------------
PL/SQL 中可以定义 TABLE 类型的变量。 TABLE 数据类型用来存储 可变长度的一维数组数据, 即数组中的 数据动态地增长 。要定义TABLE 变量,需要先定义 TABLE 数据类型。通过使用下标来引用TABLE 变量的元素。
TABLE数据类型的定义形式如下:
TYPE 类型名 IS TABLE OF 数据类型 [NOT NULL] INDEX BY BINARY_INTEGER;
此数据类型自动带有 BINARY_INTEGER 型的索引
 
【训练6 】 定义和使用 TABLE 变量:
DECLARE
TYPE type_table IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;--类型说明
v_t type_table;--定义TABLE变量
BEGIN
v_t(1):='MONDAY';
v_t(2):='TUESDAY';
v_t(3):='WEDNESDAY';
v_t(4):='THURSDAY';
v_t(5):='FRIDAY';
DBMS_OUTPUT.PUT_LINE(v_t(3));--输出变量的内容
END;

j结果:星期三

----------------------------------------------运算符和函数------------------------------------------------
PL/SQL 常见的运算符和函数包括以下方面 ( 这里只做简单的总结,可参见SQL 部分的例子 )
* 算术运算:加 (+) 、减 (-) 、乘 (*) 、除 (/) 、指数 (**)
* 关系运算:小于 (<) 、小于等于 (<=) 、大于 (>) 、大于等于(>=)、等于 (=) 、不等于 (!= <>)
* 字符运算:连接 (||)
* 逻辑运算:与 (AND) 、或 (OR) 、非 (NOT)
NULL+5的结果为NULL。
NULL>5的结果为NULL。
NULL|| 'ABC' 的结果为'ABC'。
PL/SQL 中可以使用绝大部分 Oracle 函数,但是组函数 ( AVG( ) 、MIN( )、 MAX( ) ) 只能出现在 SQL 语句中,不能在其他语句中使用。还有GREATEST( ) LEAST( ) 也不能使用。类型转换在很多情况下是自动的,在不能进行自动类型转换的场合需要使用转换函数。
分支结构是最基本的程序结构,分支结构由 IF 语句实现。
使用 IF 语句,根据条件可以改变程序的逻辑流程。 IF 语句有如下的形式:
IF 条件 1 THEN
语句序列 1
[ELSIF 条件 2 THEN
语句序列 2
ELSE
语句序列 n ]
END IF;
条件部分是一个逻辑表达式,值只能是真 (TRUE) 、假(FALSE)或空 (NULL)
 
根据具体情况,分支结构可以有以下几种形式:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-ELSE-END IF
-------------------------------- ---------- -IF-THEN-END IF --------------------------------------------
【训练7】如果温度大于 30℃ ,则显示“温度偏高”。
DECLARE
V_temprature NUMBER(5):=32;
V_result BOOLEAN:=false;
BEGIN
V_result:= v_temprature >30;
IF V_result THEN
DBMS_OUTPUT.PUT_LINE('温度'|| V_temprature ||'度,偏高');
END IF;
END;

执行结果为:

温度 32 度,偏高
该程序中使用了布尔变量,初值为 false ,表示温度低于30℃ 。表达式 v_temprature >30 返回值为布尔型,赋给逻辑变量V_result。如果变量 v_temprature 的值大于 30 ,则返回值为真,否则为假。
V_result 值为真就会执行 IF END IF 之间的输出语句,否则没有输出结果。
​​​​​​​-------------------------------- ---------- -IF-THEN-ELSE-END IF --------------------------------------------
【训练8 】 根据性别,显示尊称。
 
DECLARE
v_sex VARCHAR2(2);
v_titil VARCHAR2(10);
BEGIN
v_sex:='男';
IF v_sex ='男' THEN
v_titil:='先生';
ELSE
v_titil:='女士';
END IF;
DBMS_OUTPUT.PUT_LINE(v_titil||'您好');
END;
结果为: 先生您好!
该程序根据性别显示尊称和问候,无论性别的值为何,总会有显示结果输出。如果V_sex 的值不是‘男’和‘女’ ,那么输出结果会是什么?
​​​​​​​-------------------------------- --------- --IF-THEN-ELSIF-ELSE-END IF- -------------------------------------------
【训练9 】 根据雇员工资分级显示税金。
DECLARE
v_sal NUMBER(5);
v_tax NUMBER(5,2);
BEGIN
SELECT sal INTO v_sal
FROM emp
WHERE empno=7788;
IF v_sal >=3000 THEN
V_tax:= v_sal*0.08;--税率8%
ELSIF v_sal>=1500 THEN
V_tax:= v_sal*0.06; --税率6%
ELSE
V_tax:= v_sal*0.04; --税率4%
END IF;
DBMS_OUTPUT.PUT_LINE('应缴税金:'||V_tax);
END;
结果为: 应缴税金:320
---------------------------------------------------选择结构-----------------------------------------------------
CASE 语句适用于分情况的多分支处理,可有以下三种用法。
1 .基本 CASE 结构
语句的语法如下:
CASE 选择变量名
WHEN 表达式 1 THEN
语句序列 1
WHEN 表达式 2 THEN
语句序列 2
WHEN 表达式 n THEN
语句序列 n
ELSE
语句序列 n+1
END CASE;
在整个结构中,选择变量的值同表达式的值进行顺序匹配,如果相等,则执行相应的语句序列,如果不等,则执行ELSE 部分的语句序列
【训练10 】 使用 CASE 结构实现职务转换。
 
DECLARE
v_job VARCHAR2(10);
BEGIN
SELECT job INTO v_job
FROM emp
WHERE empno=7788;
CASE v_job
WHEN 'PRESIDENT' THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:总裁');
WHEN 'MANAGER' THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:经理');
WHEN 'SALESMAN' THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:推销员');
WHEN 'ANALYST' THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:系统分析员');
WHEN 'CLERK' THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:职员');
ELSE
DBMS_OUTPUT.PUT_LINE('雇员职务:未知');
END CASE;
END;

结果:

雇员职务 : 系统分析员
--------------------------------------------表达式结构CASE 语句-----------------------------------------------------
Oracle 中, CASE 结构还能以赋值表达式的形式出现,它根据选择变量的值求得不同的结果。
它的基本结构如下:
变量 =CASE 选择变量名
WHEN 表达式 1 THEN 1
WHEN 表达式 2 THEN 2
WHEN 表达式 n THEN n
ELSE n+1
END;
【训练11】 使用 CASE 的表达式结构。
 
DECLARE
v_grade VARCHAR2(10);
v_result VARCHAR2(10);
BEGIN
v_grade:='B';
v_result:=CASE v_grade
WHEN 'A' THEN '优'
WHEN 'B' THEN '良'
WHEN 'C' THEN '中'
WHEN 'D' THEN '差'
ELSE '未知'
END;
DBMS_OUTPUT.PUT_LINE('评价等级:'||V_result);
END;

结果为: 评价等级:
----------------------------------------2---搜索 CASE 结构-------------------------------------------------------
Oracle 还提供了一种搜索 CASE 结构,它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向。
CASE
WHEN 条件表达式 1 THEN
语句序列 1
WHEN 条件表达式 2 THEN
语句序列 2
WHEN 条件表达式 n THEN
语句序列 n
ELSE
语句序列 n+1
END CASE;
【训练12 】 使用 CASE 的搜索结构。
DECLARE
v_sal NUMBER(5);
BEGIN
SELECT sal INTO v_sal FROM emp
WHERE empno=7788;
CASE
WHEN v_sal>=3000 THEN
DBMS_OUTPUT.PUT_LINE('工资等级:高');
WHEN v_sal>=1500 THEN
DBMS_OUTPUT.PUT_LINE('工资等级:中');
ELSE
DBMS_OUTPUT.PUT_LINE('工资等级:低');
END CASE;
END;
结果为: 工资等级:高
----------------------------------------------------- 循环结构--------------------------------------------------
循环结构是最重要的程序控制结构,用来控制反复执行一段程序。比如我们要进行累加,则可以通过适当的循环程序实现。
PL/SQL 循环结构可划分为以下 3 种:
* 基本 LOOP 循环。
* FOR LOOP 循环。
* WHILE LOOP 循环。
1 .基本 LOOP 循环
基本循环的结构如下:
LOOP           --循环起始标识
语句 1;
语句 2;
EXIT [WHEN 条件 ];
END LOOP;               --循环结束标识
EXIT 用于在循环过程中退出循环, WHEN 用于定义 EXIT 的退出条件。如果没有WHEN 条件,遇到 EXIT 语句则无条件退出循环。
【训练 13 】 求:1+9+25+...+225   的值。
DECLARE
v_total NUMBER(5) := 0;
v_count NUMBER(5) := 1;
BEGIN
LOOP
v_total := v_total + v_count ** 2;
EXIT WHEN v_count = 15; -- 条件退出
v_count := v_count + 2;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_total);
END;
结果为: 680
结果在OUTPUT窗口
2 FOR LOOP 循环
FOR 循环是固定次数循环,格式如下:
FOR 控制变量 in [REVERSE] 下限 .. 上限
LOOP
语句 1;
语句 2;
END LOOP;
【训练14 】 用 FOR 循环输出图形。
BEGIN
FOR I IN 1..8
LOOP
DBMS_OUTPUT.PUT_LINE(to_char(i)||rpad('*' ,I, '*'));
END LOOP;
END;

 
结果为:
1*
2**
3***
4****
5*****
6******
7*******
8********
 
【训练15 】 输出一个空心三角形。
BEGIN
FOR I IN 1..9
LOOP
IF I=1 OR I=9 THEN
DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ' ,12-I, ' ')||rpad('*' ,2*i-1, '*'));
ELSE
DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad(' ' ,12-I, ' ')||'*'||rpad(' ' ,I*2-3, ' ')||'*');
END IF;
END LOOP;
END;

3 WHILE LOOP 循环
WHILE 循环是有条件循环,其格式如下:
WHILE 条件
LOOP
语句 1;
语句 2;
END LOOP;
当条件满足时,执行循环体;当条件不满足时,则结束循环。如果第一次判断条件为假,则不执行循环体。
 
【训练16 】 使用 WHILE 循环向 emp 表连续插入 5 个记录。
--1、插入数据
DECLARE
v_count NUMBER(2) := 1;
BEGIN
WHILE v_count <6 LOOP
INSERT INTO emp(empno, ename)
VALUES (5000+v_count, '临时');
v_count := v_count + 1;
END LOOP;
COMMIT;
END;
--2、显示插入的记录:
SELECT empno,ename FROM emp WHERE ename='临时';
--3、删除插入的记录:
DELETE FROM emp WHERE ename='临时';
-----------------------------------------多重循环------------------------------------------
【训练17 】 使用二重循环求 1 +2 +...+10 !的值。
方式1
 
DECLARE
v_total NUMBER(8):=0;
v_ni NUMBER(8):=0;
J NUMBER(5);
BEGIN
FOR I IN 1..10
LOOP
J:=1;
v_ni:=1;
WHILE J<=I
LOOP
v_ni:= v_ni*J;
J:=J+1;
END LOOP;--内循环求n!
v_total:=v_total+v_ni;
END LOOP;--外循环求总和
DBMS_OUTPUT.PUT_LINE(v_total);
END;
结果为: 4037913
方式2
DECLARE
v_total
NUMBER(8):=0;
v_ni
NUMBER(8):=1;
BEGIN
FOR I IN 1..10
LOOP
v_ni:= v_ni*I;
--求n!
v_total:= v_total+v_ni;
END LOOP;
--循环求总和
DBMS_OUTPUT.PUT_LINE(v_total);
END;
输出结果为: 4037913
【训练 18 】 插入雇员,如果雇员已经存在,则输出提示信息。
 
--1、插入
DECLARE
v_empno NUMBER(5):=7780;
v_num VARCHAR2(10);
i NUMBER(3):=0;
BEGIN
SELECT count(*) INTO v_num FROM emp WHERE empno=v_empno;--是否存在v_empno对应的记录
IF v_num=1 THEN
DBMS_OUTPUT.PUT_LINE('雇员'||v_empno||'已经存在!');
ELSE
INSERT INTO emp(empno,ename) VALUES(v_empno, 'TOM');
COMMIT;
DBMS_OUTPUT.PUT_LINE('成功插入新雇员!');
END IF;
END;
--2、查询记录
SELECT empno,ename FROM emp WHERE empno=7780;
在本程序中,使用了一个技巧来判断一个雇员是否存在。如果一个雇员不存在,那么使用SELECT...INTO 来获取雇员信息就会失败,因为SELECT...INTO 形式要求查询必须返回一行。但如果使用COUNT统计查询,返回满足条件的雇员人数,则该查询总是返回一行,所以任何情况都不会失败。COUNT 返回的统计人数为 0 说明雇员不存在,返回的统计人数为1 说明雇员存在,返回的统计人数大于1说明有多个满足条件的雇员存在。本例在雇员不存在时进行插入操作,如果雇员已经存在则不进行插入。
 
【训练19 】 输出由符号“ * ”构成的正弦曲线的一个周期 (0~ 360 ° ) ​​​​​​​
--SET SERVEROUTPUT ON SIZE 10000
--SET LINESIZE 100
--SET PAGESIZE 100
DECLARE
v_a NUMBER(8,3);
v_p NUMBER(8,3);
BEGIN
FOR I IN 1..18
LOOP
v_a:=I*20*3.14159/180;--生成角度,并转换为弧度
v_p:=SIN(v_a)*20+25;--求SIN函数值,20为放大倍数,25为水平位移
DBMS_OUTPUT.PUT_LINE(to_char(i)||lpad('*' ,v_p, ' '));--输出记录变量的某个字段
END LOOP;
END;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值