在学习PL/SQL语言时接触到几种常见的例题,主要还是游标和函数的基本应用,以下是相关的程序代码(ps:编者能力有限,如有错误之处,请指正):

准备材料:
create  table student
(sno char(6),
sname varchar2(8),
ssex char(4),
sbirth date,
class number(1)
)
drop table cjb
create table course
(cno char(4),
cname varchar2(20),
credit number(1)
)
create table cjb
(sno char(6),
cno char(6),
grade number(3)
)

begin
insert into student
values('s01','郭靖','男',to_date('1999-8-5','yyyy-mm-dd'),1);
insert into student
values('s02','黄蓉','女',to_date('1998-2-5','yyyy-mm-dd'),1);
insert into student
values('s03','欧阳峰','男',to_date('1998-3-5','yyyy-mm-dd'),2);
insert into student
values('s04','黄药师','男',to_date('1999-11-5','yyyy-mm-dd'),2);
insert into student
values('s05','乔峰','男',to_date('1999-8-5','yyyy-mm-dd'),3);
insert into student
values('s06','小龙女','女',to_date('1998-2-5','yyyy-mm-dd'),3);
insert into student
values('s07','杨过','男',to_date('1998-3-5','yyyy-mm-dd'),2);
insert into student
values('s08','李莫愁','女',to_date('1997-11-5','yyyy-mm-dd'),1);

insert into course
values('c01','高数',4);
insert into course
values('c02','数据库系统原理',3);
insert into course
values('c03','C语言',3);

insert into cjb
values('s01','c01',78);
insert into cjb
values('s01','c02',89);
insert into cjb
values('s02','c01',78);
insert into cjb
values('s02','c03',48);
insert into cjb
values('s02','c02',98);
insert into cjb
values('s03','c02',85);
insert into cjb
values('s03','c03',72);
insert into cjb
values('s04','c02',60);

insert into cjb
values('s05','c02',85);
insert into cjb
values('s05','c03',72);
insert into cjb
values('s06','c02',60);

insert into cjb
values('s07','c02',85);
insert into cjb
values('s07','c01',50);
insert into cjb
values('s08','c02',60);
end;

练习:
1.编写PL/SQL程序,查询是否有选修“指定号1(如c01)”课程的学生,如果有,统计成绩大于90分的学生个数;
如果没有,查询是否有是否有选修“指定号2(如c05)”课程的学生,如果存在,则显示所有选修该课程的学生数;
否则利用自定义异常返回信息:“尚无选修“指定号1(如c01)”和““指定号1(如c01)”课程的学生”。
--select count(sno)  from cjb where cno='c02' and grade>90;
set serveroutput on;
declare
var_cno1 course.cno%type:=&h;     /*注意:由于var_con1是varchar类型,所以在输入时要加‘’,如   'c02'   */
var_cno2 course.cno%type:=&m;
null_exeption exception;
m number;
begin
select count(sno) into m from cjb where cno=var_cno1 and grade>90;
if m!=0 then dbms_output.put_line('选修'||var_cno1||'且成绩大于90的人数为'||m);
elsif m=0
then select count(sno) into m from cjb where cno=var_cno2;   dbms_output.put_line('选修'||var_cno2||'的人数为'||m);
end if;
if m=0
then raise null_exeption;
end if;
exception
when null_exeption then
dbms_output.put_line('尚无选修'||var_cno1||'和'||var_cno2||'的学生');
end;

例如:输入c02、c01,输出结果:选修c02 课程且分数在90分以上的学生人数:1
输入c05、c01,输出结果:选修c01 课程的学生人数:3
输入c07、c08,输出结果:尚无选修c07 和c08 课程的学生

2. 使用函数根据学生的姓名和课程名返回该学生该门课程的成绩等级(90以上优秀;75-90良好;60-75中等,60以下不及格);
例如: “黄蓉”,“高数”,输出:黄蓉高数课程的成绩等级为良好
select grade  from cjb where cno=(select cno from course where cname='高数') and sno=(select sno from student where sname='黄蓉')

create or replace function search_function(var_sname student.sname%type,var_cname course.cname%type) return number is
sgrade cjb.grade%type;
begin
select grade into sgrade from cjb where cno=(select cno from course where cname=var_cname) and sno=(select sno from student where sname=var_sname);
if sgrade>90
then dbms_output.put_line(var_sname||'的'||var_cname||'课程成绩为优秀');
elsif sgrade<90 and sgrade>75
then dbms_output.put_line(var_sname||'的'||var_cname||'课程成绩为良好');
elsif sgrade<75 and sgrade>60
then dbms_output.put_line(var_sname||'的'||var_cname||'课程成绩为及格');
elsif sgrade<60
then dbms_output.put_line(var_sname||'的'||var_cname||'课程成绩为不及格');
end if;
return null;
end;

declare
var_sname course.cname%type:=&h;
var_cname student.sname%type:=&b;
m number;
begin
m:=search_function(var_sname,var_cname);
end;

3.编写PL/SQL程序,输出所有不及格学生的学号、姓名、选修的课程名及成绩;
declare
cursor cur_cjb is 
select cjb.sno,sname,cname,grade from cjb,course,student where cjb.sno=student.sno and cjb.cno=course.cno and grade<60;
type record_cjb is record(
var_sno student.sno%type,
var_sname student.sname%type,
var_cname course.cname%type,
sgrade cjb.grade%type);
cjb1 record_cjb;
begin
open cur_cjb;
fetch cur_cjb into cjb1;
while cur_cjb%found loop
dbms_output.put_line('不及格的学生学号为'||cjb1.var_sno||'姓名是'||cjb1.var_sname||'   课程名为'||cjb1.var_cname||'  成绩为'||cjb1.sgrade);
fetch cur_cjb into cjb1;
end loop;
close cur_cjb;
end;

4.编写PL/SQL程序,输出所有课程的选课人数和平均分;
declare
cursor cur_cjb is 
select cno,count(sno),round(avg(grade),1) from cjb group by cno;
type record_cjb is record(
var_cno cjb.cno%type,
num number,
sgrade cjb.grade%type);
cjb1 record_cjb;
begin
open cur_cjb;
fetch cur_cjb into cjb1;
while cur_cjb%found loop
dbms_output.put_line('所选课程号'||cjb1.var_cno||'人数'||cjb1.num||'平均分'||cjb1.sgrade);
fetch cur_cjb into cjb1;
end loop;
close cur_cjb;

end;

5. 创建并执行存储过程,根据学号和课程号返回该学生获得的学分(注:该门课程不及格不能获得学分)
 create or replace procedure course1(var_eno in cjb.sno%type,var_dno in cjb.cno%type,var_grade out cjb.grade%type) is
 begin
 select grade into var_grade from cjb where sno=var_eno and cno=var_dno;
 if var_grade<60 then 
 var_grade:=0;
 dbms_output.put_line('该学生成绩不及格,无法获取学分');
 end if;
 end;
 declare
 var_grade  cjb.grade%type;
 begin
 course1('s07','c02',var_grade);
 dbms_output.put_line(var_grade);
 end;

建立一个触发器,限定学生所选课程不能超过3门

create or replace trigger insert1

before insert on cjb
for each row
declare
num number;
begin
select count(sno) into num from cjb where sno=:new.sno;
if num>=2
then 
 raise_application_error(-20009,'选课不能超过3门');
 end if;
end;

insert into cjb
values('s01','c03',98);
delete from cjb where sno='s01' and cno='c03';

版权所有 https://blog.csdn.net/pengxiang1998 未经允许,禁止转载

PL/SQL语言简单案例相关推荐

  1. Oracle PL/SQL语言入门

    一.背景介绍 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方 ...

  2. Oracle PL/SQL语言初级教程(自学)

    Oracle PL/SQL语言初级教程 PL/SQL 语言基础 PL/SQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令. 通过使用 PL/SQL 程序 ...

  3. KingbaseES PL/SQL 过程语言参考手册(3. PL/SQL语言基础)

    3. PL/SQL语言基础¶ 本章节阐述PL/SQL语言的基本组成. 字符集 词法单元 声明 对标识符的引用 标识符的作用域和可见性 为变量赋值 表达式 错误报告函数 3.1. 字符集 任何要由PL/ ...

  4. Oracle数据库——PL/SQL程序设计综合案例

    一.程序设计方法 1.瀑布模型 2.SQL 语句 3.变量: 初始值是多少 最终值如何得到 二.综合案例 1.综合案例1 统计每年入职的员工人数 /*SQL语句select to_char(hired ...

  5. PL/SQL语言基础

    PL/SQL语言基础 /********************************数据类型*************************************/ %rowtype  (行对 ...

  6. Oracle PL/SQL语言初级教程

    http://fs3.dajie.com/2010/09/20/034/12849518348824410.pdf PL/SQL语言基础 复合数据类型 单行函数和组函数 表和视图 完整性约束 过程和函 ...

  7. PL/SQL语言必看书籍推荐

    PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/S ...

  8. 用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)

    用PL/SQL语言编写一程序,实现按部门分段(6000以上.(6000,3000).3000元以下)统计各工资段的职工人数.以及各部门的工资总额(工资总额中不包括奖金) 输出到一张表中 直接输出在屏幕 ...

  9. 【PL/SQL】PL/SQL语言基础

    一.PL/SQL的块 (1)块(Block)是PL/SQL的基本程序单元 (2)一个PL/SQL应用程序由一个或多个块组成 1.PL/SQL块的基本组成 (1)定义部分(declare) --定义常量 ...

  10. oracle 12c pl/sql语言,ORACLE 12C SQL语句中通过with 定义PL/SQL 函数

    在ORACLE 12C支持在sql语句中编写函数,用来实现sql语句操作需要使用函数的部分功能,该功能对于你不想在数据库中新建函数 or 你的库是read only模式下要使用新函数实现某种功能,可以 ...

最新文章

  1. Virtual Machine--Vmware(2)
  2. 【NLP笔记】文本生成?还不快上知识库
  3. 线性回归(y=ax+b)
  4. polybase配置 sql_Hadoop 的 PolyBase 配置和安全
  5. 如何编写更少,更好的代码,或Project Lombok
  6. photoshop script
  7. 【JS 逆向百例】复杂的登录过程,最新微博登录逆向
  8. android各组件翻译,Android App框架指南(译文)
  9. html无序列表文字换行,ppwjs之bootstrap文字排版:无序列表项不换行
  10. python多态如何理解_大家对python中多态是如何理解的?
  11. (九)洞悉linux下的Netfilteriptables:网络地址转换原理之DNAT
  12. (转)曹锋、宋天玮:区块链技术在证券市场中的应用探索
  13. gradle下载很慢的解决方式
  14. Vue3新特性——Composition API详解
  15. mysql一个汉字是几个字节_mysql里一个中文汉字占多少字节数?
  16. 如何用u盘给惠普服务器安装系统,如何用u盘装惠普系统教程
  17. Linux ping 命令
  18. 【XLPNet车牌识别算法】第一章 序
  19. R 绘制带有数字标签的多分类柱状图
  20. matlab图形与动画设计 pdf,MATLAB图形与动画设计

热门文章

  1. python selenium模拟浏览器操作实战(武汉大学原教务系统)
  2. Unity实现Text BestFit文本超框时再缩小字体
  3. 将使用Kivy的Python程序打包为安卓的apk文件(使用python-for-android)
  4. TensorFlow 之 slim(TF-Slim)介绍
  5. 检察院批准逮捕洪磊,铁杆分子不买帐
  6. 百度地图开发(一)----项目准备
  7. Word 首页如何不插入页码? 页码从正文开始,如何分节
  8. 北京摇号新政发布!每人只留一指标 60%新能源指标优先无车家庭
  9. 卡内基梅隆大学计算机科学博士,卡内基梅隆大学有哪些专业处于世界顶尖水平?...
  10. nevada用计算机弹,Nevada吉他谱(gtp谱,指弹,独奏,演奏视频)_Vicetone