Oracle——PL/SQL 块结构练习题

Posted Xiu Yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle——PL/SQL 块结构练习题相关的知识,希望对你有一定的参考价值。


1、输出文字

set serveroutput on;
declare
begin
	dbms_output.put_line('输出文字!!!');
end;
/

在这里插入图片描述


2、计算长方形面积

declare
	v_length number:=&length;
	v_width number:=&width;
	v_area number;
begin
	dbms_output.put_line('长方形的面积为:'||v_length*v_width);
end;
/

在这里插入图片描述


3、块结构计算长方形周长与面积

declare
	v_length number:=&length;
	v_width number:=&width;
	v_area number;
begin
	declare
		v_cir number;
	begin
		v_cir := (v_width+v_length)*2;
		dbms_output.put_line('周长为:'||v_cir);
	end;
	v_area := v_length*v_width;
	dbms_output.put_line('面积为:'||v_area);
end;
/

在这里插入图片描述


4、计算圆的面积

declare
	v_r number:=&v_r;
	v_area number;
begin
	v_area := ACOS(-1)*v_r*v_r;
	dbms_output.put_line('圆面积为:'||v_area);
end;
/

在这里插入图片描述


5、输入学生学号,判断学生获得奖学金等级

-- 创建学生表
create table student(
sno number primary key,
grade number);

-- 插入数据
insert into student values(1, 70);
insert into student values(2, 90);

-- %TYPE 参考数据类型
-- select...into...赋值语句
declare 
v_sno student.sno %TYPE:=&sno;
v_grade student.grade %TYPE;
begin
	select avg(grade) into v_grade from student where sno = v_sno;
	case
		when v_grade > 85 then
			dbms_output.put_line('此同学平均成绩为:'||v_grade||',一等奖学金');
		when v_grade > 75 then
			dbms_output.put_line('此同学平均成绩为:'||v_grade||',二等奖学金');
		else
			dbms_output.put_line('此同学平均成绩为:'||v_grade||',没有奖学金');
	end case;
end;

在这里插入图片描述


6、求 1 到 10 的平方

两种实现方式:

方式 1:

declare 
	i number := 1;
begin	
	loop
		dbms_output.put_line(i||'的平方数为'||i*i);
		i:=i+1;
		exit when i > 10;
	end loop;	
end;

方式 2:

declare 
	i number := 1;
begin	
	loop
		dbms_output.put_line(i||'的平方数为'||i*i);
		i:=i+1;
		if i > 10 then
			exit;
		end if;
	end loop;	
end;

在这里插入图片描述


7、求 10 的阶乘

三种实现方式:

方式 1:

declare
	i number := 1;
	ans number := 1;
begin
	loop
		ans := ans * i;
		i := i + 1;
		exit when i >10;
	end loop;
	dbms_output.put_line('10的阶乘为'||ans);
end;

方式 2:

declare
	ans number := 1;
	i number := 1;
begin
	while i<=10 loop
		ans := ans*i;
		i := i + 1;
	end loop;
	dbms_output.put_line('10的阶乘为'||ans);
end;

方式3:

declare
	ans number := 1;
begin 
	for i in 1..10 loop
		ans := ans*i;
	end loop;
	dbms_output.put_line('10的阶乘为'||ans);
end;
/

在这里插入图片描述


8、计算表达式(86+20×3-152)的绝对值

declare
	v_abs number(8);	
begin 
	v_abs := abs(8+20*3-152);
	dbms_output.put_line('v_abs='||v_abs);
end;

在这里插入图片描述


9、计算(86+20×3-152)的绝对值,然后判断该值是否大于80(if else语句)

declare
	v_abs number(8);
begin
	v_abs := abs(86+20*3-152);
	if v_abs >= 80 then
		dbms_output.put_line('v_abs='||v_abs||'该值是大于等于80的');
	else
		dbms_output.put_line('v_abs='||v_abs||'该值是小于80的');
	end if;
end;

在这里插入图片描述


10、根据不同的学习成绩,输出对应的成绩界别

  根据不同的学习成绩,输出对应的成绩界别:小于60为不及格,60到70(不含)为及格,70到85(不含)为良好,大于85为优秀。88分为哪一级?

if elsif 语句方式:

declare
	grade number(5) := &grade;
begin
	if grade<60 then
		dbms_output.put_line('不及格'||grade);
	elsif 60<=grade and grade<70 then
		dbms_output.put_line('及格'||grade);
	elsif 70<=grade and grade<85 then
		dbms_output.put_line('良好'||grade);
	else
		dbms_output.put_line('优秀'||grade);
	end if;
end;

在这里插入图片描述


case when 方式:

declare
	v_grade number(5) := &grade;
begin
	case
		when v_grade<60 then dbms_output.put_line('不及格'||v_grade);
		when 60<=v_grade and v_grade<70 then dbms_output.put_line('及格'||v_grade);
		when 70<=v_grade and v_grade<85 then dbms_output.put_line('良好'||v_grade);
		else dbms_output.put_line('优秀'||v_grade);
	end case;
end;
/

在这里插入图片描述


11、LOOP循环,从10开始实现每次循环都让变量递减2,直到变量的值小于1,然后终止循环

两种实现方式:

简单循环方式:

declare
	i number(5) := 10;
	j number(5) := 1;
begin
	loop
		dbms_output.put_line('第'||j||'次循环,i = '|| i);
		i := i-2;
		j := j+1;
		exit when i<1;
	end loop;
end;

while 循环方式:

declare
	i number(5) := 10;
	j number(5) := 1;
begin
	while i>1 loop
		dbms_output.put_line('第'||j||'次循环,i = '|| i);
		i := i-2;
		j := j+1;
	end loop;
end;

在这里插入图片描述


12、输入水果名称查询对应编号

  从水果表 FRUITS 中查询产品名称为 apple 对应的产品编码,并将编码存储到变量v_ss_id中,最后输出的屏幕上,运行结果如下:apple对应的编码是:101,异常处理部分若没有找到:apple没有对应的编码,若对应多个:apple没有对应的编码(包括声明部分、执行体部分和异常处理部分的结构)

-- 创建水果表
CREATE TABLE fruits(
f_id    varchar2(10)     	NOT NULL,
s_id    number(6)        	NOT NULL,
f_name  varchar(255)  	NOT NULL,
f_price number (8,2)  	NOT NULL
);

-- 插入数据
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES  ('a1', 101,'apple',5.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('b1',101,'blackberry', 10.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('bs1',102,'orange', 11.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES('bs2',105,'melon',8.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('t1',102,'banana', 10.3);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('t2',102,'grape', 5.3);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('o2',103,'coconut', 9.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES  ('c0',101,'cherry', 3.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES  ('a2',103, 'apricot',2.2);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES('l2',104,'lemon', 6.4);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('b2',104,'berry', 7.6);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES ('m1',106,'mango', 15.6);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES  ('m2',105,'xbabay', 2.6);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES  ('t4',107,'xbababa', 3.6);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES  ('m3',105,'xxtt', 11.6);
INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES('b5',107,'xxxx', 3.6);
declare
	v_ss_id fruits.s_id %TYPE ;
begin
	select s_id into v_ss_id from fruits where f_name = 'apple';
	dbms_output.put_line('apple对应的编号是:'|| v_ss_id);
	exception 
		when no_data_found then
			dbms_output.put_line('apple没有对应的编码');
		when too_many_rows then
			dbms_output.put_line('apple没有对应的编码');
end;

在这里插入图片描述


13、用搜索式 CASE 语句找到水果编号对应的水果名称

declare
	v_id fruits.f_id %TYPE := &f_id;
	v_name fruits.f_name %TYPE;
begin	
	select f_name into v_name from fruits where f_id = v_id;
	dbms_output.put_line('编号为:'||v_id);
	case v_name
		when 'banana' then
			dbms_output.put_line('香蕉'||v_name);
		when 'apple' then
			dbms_output.put_line('苹果'||v_name);
		else
			dbms_output.put_line('没有要找的水果');
	end case;
end;

在这里插入图片描述


14、输入一个部门的编号,查看部门信息

  自己创建两个表dept(deptno,dname),emp(emp_no,emp_name,deptno,sal),记录自己输入,然后编写pl/sql程序:输入一个部门的编号,显示出这个部门的名称,总人数,平均工资。(使用%TYPE)

-- 创建部门表
create table dept(
    deptno number not null,
    dname varchar(20) not null,
    loc varchar(20) not null
);

-- 创建员工表
create table emp(
    emp_no number not null,
    emp_name varchar(20) not null,
    job varchar(20) not null,
    sal number  not null,
    deptno number not null
);

-- 插入数据
insert into dept values(10, 'account', 'new york');
insert into dept values(20, 'salesman', 'chicago');
insert into dept values(30, 'reserach', 'dallas');
insert into dept values(40, 'operations', 'boston');

insert into emp values(1001, 'mary', 'account', 5000, 10);
insert into emp values(1002, 'smith', 'salesman', 7200, 20);
insert into emp values(1003, 'kate', 'account', 7000, 30);
declare
	v_deptno dept.deptno %TYPE := &v_deptno;
	v_dname dept.dname %TYPE;
	v_num number(7);
	v_avg_sal emp.sal %TYPE;
begin 
	select dname into v_dname from dept where deptno = v_deptno;
	select count(*),avg(sal) into v_num, v_avg_sal from emp where deptno = v_deptno;
	dbms_output.put_line('该部门名称:'||v_dname);
	dbms_output.put_line('该部门员工人数:'||v_num);
	dbms_output.put_line('该部门平均工资:'||v_avg_sal);
	exception 
		when no_data_found then
			dbms_output.put_line('该部门不存在或该部门没有员工!');
end;
/

在这里插入图片描述


15、使用%ROWTYPE类型定义变量,获取员工信息

使用%ROWTYPE类型定义变量,获取某一员工号的员工的信息,并输出该成员的姓名和部门编号。

declare
	v_emp_no emp.emp_no %TYPE := &v_emp_no;
	v_row_emp emp %ROWTYPE;
begin
	select * into v_row_emp from emp where emp_no = v_emp_no;
	dbms_output.put_line('该员工为:'||v_row_emp.emp_name);
	dbms_output.put_line('部门编码为:'||v_row_emp.deptno);
end;
/

在这里插入图片描述

以上是关于Oracle——PL/SQL 块结构练习题的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库之PL/SQL 块结构和组成元素

pl/sql基础练习

Oracle_PL/SQL 匿名块

Oracle之PL/SQL编程

PL/SQL语法简介(匿名PL/SQL块)

Oracle Apex:PL/SQL 块中的 Javascript 代码