PL/SQL程序基础1

  • 一.实验目标
    • 1、针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力;
    • 2、承担Oracle数据库系统的实施、运行与维护等基本工作的能力。
  • 二.实验项目
  • 三.实验错误解决方案
    • 问题一:创建的过程带有编译错误问题

一.实验目标

掌握PL/SQL程序的基本结构编程,具备如下能力:

1、针对数据库应用领域的数据需求,设计出基于Oracle数据库的解决方案的能力;

2、承担Oracle数据库系统的实施、运行与维护等基本工作的能力。

二.实验项目

编写存储过程或存储函数完成以下各题,存储过程或函数依次命名为obj2_1、obj2_2、…
以下1-7题与EMP、DEPT表有关。
如果没有上述基本表,可以用下述SQL语句创建:

create table COUNTRIES as select * from univ.COUNTRIES;
create table DEPT as select * from univ.DEPT;
create table EMP as select * from univ.EMP;

1、输出名为SMITH的雇员的工资和职位。(存储过程)

create or replace procedure obj2_1 as vsal emp.sal%type; vjob emp.job%type;
beginselect sal,job into vsal, vjob from emp where ename='SMITH';dbms_output.put_line(vsal ||','|| vjob);
end;
.
/
set serveroutput on;
exec obj2_1;

2、传送参数部门编号,输出该部门名和地理位置。(存储过程)

create or replace procedure obj2_2(z_deptno dept.deptno%type)
as  z_dname dept.dname%type;z_loc dept.loc%type;
beginselect dname,locinto z_dname,z_locfrom deptwhere deptno=z_deptno;dbms_output.put_line(z_dname||' '||z_loc);
end;
.
/
exec obj2_2(30)

3、传送参数雇员号,输出该雇员的工资和提成,没有提成的用0替代。(用%type实现)。(存储过程)

create or replace procedure obj2_3(v_empno emp.empno%type)
as  v_sal emp.empno%type;v_comm emp.comm%type;
beginselect sal,nvl(comm,0)into v_sal,v_commfrom empwhere empno=v_empno;dbms_output.put_line(v_sal||' '||v_comm);
end;
.
/
set serveroutput on;
exec obj2_3(7369)

4、传送参数雇员号,输出该雇员的所有信息,没有提成的用0替代。(用%rowtype实现)。(存储过程)

create or replace procedure obj2_4(vempno emp.empno%type) asrow_emp emp%rowtype;beginselect empno, ename,job,mgr, hiredate,nvl(sal,0),nvl(comm,0),deptnointo row_empfrom empwhere empno= vempno;dbms_output.put(row_emp.empno||','||row_emp.ename||',');dbms_output.put(row_emp.job||','||row_emp.mgr||',');dbms_output.put(row_emp.hiredate||','||row_emp.sal||',');dbms_output.put_line(row_emp.comm||','||row_emp.deptno);end;
.
/
set serveroutput on;
exec obj2_4(7369)

5、传送参数雇员号,返回该雇员的工资。(存储函数)

create or replace function obj2_5(v_empno emp.empno%type) return integer as  v_sal emp.sal%type;
begin select sal into v_sal from emp where empno=v_empno;return v_sal;
end;
.
/
select obj2_5(7369)from dual;

6、传送参数雇员名或雇员编号,判断他的job,根据job不同,为他增加相应的sal(用if-elsif实现,不要改动到基本表emp,创建一个与emp表一模一样的表emp1)。(存储过程)
 Job     raise
 clerk    +500
 salesman +1000
 analyst  +1500
 otherwise +3000

create table emp1 as select * from emp;
create or replace
procedure obj2_6(vempno emp1.empno%type,vname emp1.ename%type) asvsal  emp1.sal%type; vjob emp1.job%type;begin
select sal,job into vsal,vjob from emp1 where empno=vempno or ename=vname;if vjob='CLERK' then vsal:=vsal+500;elsif vjob='SALESMAN' then vsal:=vsal+1000;elsif vjob='ANALYST' then vsal:=vsal+1500;else vsal:=vsal+3000;end if;update emp1 set sal=vsal where (vempno=empno) or (ename=vname);dbms_output.put_line(vname||'的工资已经更改为:'||vsal);
end;
.
/
exec obj2_6(7369,'');
exec obj2_6('','SMITH');

7、传送参数部门编号,按照下列加工资比例执行给该部门的雇员加工资(用CASE实现,修改emp1表的数据) (存储过程)
 deptno raise(%)
 10   8%
 20   10%
 30   20%
 40   20%
加薪比例以现有的sal为标准。

create or replace
procedure obj2_7(vdeptno emp1.deptno%type) asbegincase(vdeptno)when 10 then update emp1 set sal=sal*1.08 where deptno=vdeptno; when 20 then update emp1 set sal=sal*1.18 where deptno=vdeptno;when 30 then update emp1 set sal=sal*1.20 where deptno=vdeptno;when 40 then update emp1 set sal=sal*1.20 where deptno=vdeptno;end case;dbms_output.put_line(vdeptno||'部门的加薪已完成');
end;
.
/
set serveroutput on;
exec obj2_7(20);

以下8-12题与以下表有关:学生、学费标准表、收费表、收费明细表。先从a_db模式中将这些表等复制到自己的模式中。

学生每学年开学前必须注册。开始注册前要初始化学生表,所有状态为“注册”的学生的状态设置为空值,注册后设置为"注册",还有“毕业”、“开除”、“休学”等状态。注册时在收费表生成相应记录。学生每学年按学生所属专业收取学费,交学费时产生收费明细记录,并修改收费表中相应记录。

create table 学生 as select * from a_db.学生;
create table 学费标准表 as select * from a_db.学费标准表;
create table 收费表 as select * from a_db.收费表;
create table 收费明细表 as select * from a_db.收费明细表;

8、在学生表中增加一列,用来记录学生的密码,写一个PL/SQL程序,模拟登录的过程。输入学号和密码,判断是否正确,对于登录成功和失败分别给出提示信息。(存储过程)
增加密码列
alter table 学生 add 密码 varchar2(12);
创建了学生表的密码列,设置密码为666
update 学生 set 密码 = ‘666’,

create or replace
procedure obj2_8(v_学号  学生.学号%type,v_密码 学生.密码%type) asvv_学号  学生.学号%type;vv_密码 学生.密码%type;beginselect 学号,密码 into vv_学号,vv_密码from 学生where v_学号=学号 and v_密码=密码;dbms_output.put_line('登录成功!');      exceptionwhen no_data_found thendbms_output.put_line('登陆失败');
end;

9、编写一个向学费标准表添加记录的过程。

create or replace
procedure obj2_9 (v_专业 学费标准表.专业%type,v_学年     学费标准表.学年%type,v_学费    学费标准表.学费%type) asbegininsert into 学费标准表(专业, 学年, 学费)values (v_专业, v_学年, v_学费);dbms_output.put_line(v_专业||','||v_学年||','||v_学费||'添加完成');end;
.
/
exec obj2_9('计算机科学与技术','2017','13000');

10、编写一个学生注册的过程,注册日期默认为当天,以学号为参数。

create or replace
procedure obj2_10(v学号  学生.学号%type) asbegininsert into 学生(学号,注册日期) values  (v学号,sysdate);update 学生 set 状态='注册' where 学号=v学号 and 状态='null';dbms_output.put_line(v学号||'学生已在'|| to_char (sysdate,'yyyy-mm-dd')||'注册成功');end;
.
/

11、编写一个收学费的过程,收费日期默认为当天,以学年、 学号、学费为参数。

create or replace
procedure obj2_11(v_学年 收费明细表.学年%type,v_学号 收费明细表.学号%type,v_学费 收费明细表.学费%type) asbegininsert into 收费明细表(学年,学号,学费)  values (v_学年, v_学号, v_学费);dbms_output.put_line('成功添加学生'||v_学号||'在'|| v_学年||'学年的付费记录,共付款:'|| v_学费||'元');end;
.
/
exec obj2_11('2019','S101',1300);

12、编写一个过程,输出指定学年的欠费情况(含欠费人数、欠费总金额)。

create or replace
procedure obj2_12(v_学年     收费表.学年%type) astotal  number(5);money  number(10);beginselect count(学号),sum(应交学费-已交学费) ainto total,moneyfrom 收费表where 学年=v_学年 and 应交学费>已交学费;dbms_output.put_line('欠费人数为:'||total||'    欠费金额为:'||money);  end;
.
/
exec obj2_12('2016');
select 学号,应交学费-已交学费 from 收费表 where 学年=2016 and 已交学费< 应交学费;

13、输出如下九九乘法表。(存储过程)

 create or replace procedure obj2_13
asi int;j int;
beginfor i in 1..9 loopfor j in 1..i loopdbms_output.put(i||'*'||j||'='||(i*j)||' ');end loop;dbms_output.put_line(' ');end loop;
end;
.
/
exec obj2_13

三.实验错误解决方案

问题一:创建的过程带有编译错误问题

1、问题的出现
在实验项目2中创建“传送参数部门编号,输出该部门名和地理位置。(存储过程)”,SQL语句如下:

create or replaceprocedure obj2_2 (vdeptno in DEPT.dept%type)as   vdname dept.dname%type;vloc dept.loc%type;
beginselect dname,locinto vdname,vlocfrom deptwhere deptno= vdeptno;dbms_output.put_line(dname ||','|| loc);
end;

出现错误:
警告:创建的过程带有编译错误

2、问题分析

错误出现在第3行,表明“%type”定义数据类型有问题。使用由%TYPE定义的变量时要用“.”运算符指定表名限定词,而且不用加“in”。但在第3行中由于C语言的语法干扰加了“in”,所以出错。

3、解决方案
解决方案如下:

create or replace procedure obj2_2(z_deptno dept.deptno%type)
as  z_dname dept.dname%type;z_loc dept.loc%type;
beginselect dname,locinto z_dname,z_locfrom deptwhere deptno=z_deptno;dbms_output.put_line(z_dname||' '||z_loc);
end;
.
/
exec obj2_2(30)

执行该语句后,表已创建,问题解决。

PL/SQL程序基础1相关推荐

  1. PL/SQL程序基础2

    PL/SQL程序基础2 一.实验目标 二.实验项目 三.实验错误解决方案 一.实验目标 掌握较复杂的PL/SQL编程方法.具备如下能力: 针对数据库应用领域的数据需求,设计出基于Oracle数据库的解 ...

  2. Oracle数据库之PL/SQL程序基础设计

    一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /** 声明部分--定义常量.变量.复杂数据类型.游标.用户自定义异常*/ BEGIN /** 执行部分 ...

  3. PL/SQL语言基础

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

  4. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  5. ORA-00980与PL/SQL程序编译出错

        今天碰到一个有意思的问题.     为了降低统计分析数据库的计算和磁盘空间压力.我们使用了将远程数据库中数据通过DBLINK和SYNONYM的形式来缓解当前统计数据库所面临的问题.工作实施的比 ...

  6. Oracle 实验六:PL/SQL编程基础(1)

    实验六:PL/SQL编程基础(1) 一.实验目的 1.熟悉掌握PL/SQL编程中的变量定义语句 2.熟悉掌握PL/SQL编程中的条件语句和循环语句等流程控制语句. 3.能熟练使用上述基本语句编写PL/ ...

  7. Oracle PL/SQL语句基础学习笔记(上)

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

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

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

  9. 视频教程-赵强老师:Oracle数据库从10g到11g(4)PL/SQL编程基础-Oracle

    赵强老师:Oracle数据库从10g到11g(4)PL/SQL编程基础 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblo ...

最新文章

  1. python3 读写中文文件
  2. 三步搞定 opencv 初始环境设定
  3. python 列表生成式_深度好文:Python之列表生成式、生成器、可迭代对象与迭代器(一)...
  4. 有关ftp4j的FTPListParseException异常
  5. 代理模式 、JDK动态代理、cglib动态代理
  6. 面向大数据的异构内存系统
  7. 【2016年第6期】支持植物学大数据整合与公众服务的iFlora云平台建设
  8. 在VC资源文件中加入声音资源
  9. MIKE水动力笔记10_潮汐调和分析与绘制同潮时线图
  10. 2021全国化妆品产业区域研究报告
  11. 身份证后四位是否唯一
  12. 51单片机蜂鸣器演奏《我和我的祖国》
  13. chrome操作系统_Google Chrome操作系统:事实与谬论
  14. 《第五项修炼,学习型组织的艺术与实践》读书笔记
  15. 炼数成金 Oracle EBS R12 DBA培训视频教程
  16. 云服务器如何共享文件夹,云服务器如何设置共享文件夹
  17. qq安全保护进程更改计算机,QQ安全中心
  18. 抖音原创视频如何制作?鹰迪电子商务
  19. layui使用模板渲染数据
  20. 塔式、刀片和机架:三种类型的服务器介绍

热门文章

  1. 问题 J: 古罗马数字2
  2. linux 32位和64位的区别 内存,32位、64位的区别
  3. 视频号扩展链接一键转换文章链接
  4. CVPR2021目标跟踪汇总(一)
  5. linux查看riak版本,riak源码阅读手记 压力测试
  6. 用什么软件可以提高视频批量剪辑的效率
  7. arm芯片中的浮点运算(一)
  8. MinIO纠错码、分布式MinIO集群搭建及启动
  9. word20161229
  10. matlab模拟双星问题,物理定律、数学模型告诉你,天下有情人终将分手!