工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > 数据库 > 正文
Oracle PL/SQL入门之案例实践
[文章信息]
作者:冯杰
时间:2004-09-17
出处:天极网
责任编辑:方舟
[文章导读]
本文将结合一个案例来加深对PL/SQL基础知识的理解
advertisement
热点推荐
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
· 在VB6中用命令行为模式控制GUI动作
[正文]
  前面已经了解了关于PL/SQL编程的基础,本文将结合一个案例来加深对这些知识点的理解。

  一. 案例介绍

  某数据库有两张表,是关于某公司员工资料、薪水和部门信息的,它们分别是emp表和dept表,两张表的结构如下:


  要求如下:

  1、按照上表结构建立相应的表,并每张表写入5组合法数据。

  2、操纵相关表,使得“技术部”的员工的薪水上涨20%。

  3、建立日志,追踪薪水变动情况。

  4、建立测试包。

  二. 案例的分析与实现

  从前面案例的介绍不难看出,要求1考察点为基本SQL语句;要求2主要考察复合查询;要求3是考察触发器的应用;要求4的考察面相对多一些,不仅考察了包的创建,而且也考察了在PL/SQL中的测试方法。了解了这些考察的知识点,就可以一一去解决。

  要求1:

  首先根据前面表的结构可以创建两张表:

  ——创建员工表

create table emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4));

  ——部门表

create table dept (dept_id number(3), dept_name varchar2(20), emp_id number(5));

  建立了表之后就可以往表里面写数据了,这里把添加表记录的代码写入到相应的存储过程。

/*给emp表添加记录的存储过程*/
create or replace procedure ins_table_emp(p_emp_id number,p_emp_name varchar2,p_emp_salary number) as
v_emp_id number:=p_emp_id;
v_emp_name varchar2(20):=p_emp_name;
v_emp_salary number:=p_emp_salary;
begin
 insert into emp values (v_emp_id,v_emp_name,v_emp_salary);
end ins_table_emp;

/*给dept表添加记录的存储过程*/
create or replace procedure ins_table_dept(p_dept_id number,p_dept_name varchar2,p_emp_id number) as
 v_dept_id number:=p_dept_id;
 v_dept_name varchar2(20):=p_dept_name;
 v_emp_id number:=p_emp_id;
begin
 insert into dept values (v_dept_id,v_dept_name,v_emp_id);
end ins_table_emp;

/*调用相应的存储过程实现记录添加*/
begin
 ins_table_emp(10000,'',4000);
 ins_table_emp(10001,'??èy',2300);
 ins_table_emp(10002,'3?t',3500);
 ins_table_emp(10003,'à???',3500);
 ins_table_emp(10004,'á?ò?',3500);

 ins_table_dept(111,'DD?t2?',10000);
 ins_table_dept(111,'DD?t2?',10001);
 ins_table_dept(111,'DD?t2?',10002);
 ins_table_dept(112,'??ê?2?',10003);
 ins_table_dept(113,'êD3?2?',10004);
end;

  要求2:

  给指定部门的员工加薪,这实际上是一个复合查询,首先需要把所有该部门的员工塞选出来,然后对这些员工的薪水进行相应的改动。依照这一思路,代码如下:

  (需要注意的是:将要加薪的部门作为参数,这样的存储过程更有灵活性。)

create or replace procedure add_salary(p_dept_name varchar2) as
v_dept_name varchar2(20):=p_dept_name;
begin
 update emp set emp.EMP_SALARY=emp.EMP_SALARY*1.2 where emp.EMP_ID in (select emp.EMP_ID from emp,dept where emp.EMP_ID=dept.EMP_ID and dept.DEPT_ID='??ê?2?');
end add_salary;

  要求3:

  建立日志对薪水的变动情况形成一个追踪,也就是说,如果对某个职员的薪水进行变更就应该将其相应的变更记录全部记下来。如果对emp表的salary字段创建一个触发器,来监视对salary的更改,把每次更改进行记录,这样就达到了要求3的目的了。

create or replace trigger print_salary_change  
before delete or insert or update on emp  --触发事件
for each row                  -- 每修改一行都需要调用此过程

declare           --只有触发器的声明需要declare,过程和函数都不需要
salary_balance number;
begin
--:new 与:old分别代表该行在修改前和修改后的记录
salary_balance=:new.salary=:old.salary;
dbms_output.PUT_LINE('old salary is: '|| :old.salary);
dbms_output.PUT_LINE('old salary is: '|| :new.salary);
dbms_output.PUT_LINE('old salary is: '|| to_char(salary_balance));
end print_salary_change;

  要求4:

  与其他语言(c/c++等)相比,PL/SQL的测试有其不同之处,归纳下来有三种方法:

  1、使用DBMS_OUTPUT包的PUT_LINE方法来显示中间变量,以此来观察程序是否存在逻辑错误。

  2、插入测试表的方法。即创建一个临时的中间表,然后把所有涉及到的中间变量的结果都作为记录插入到中间表中,这样可以查询表中的结果来观察程序的执行情况。

  3、使用异常处理手段,对可疑的程序段使用begin … end ,然后可以在exception里进行异常捕获处理。

  这里准备使用第二种方法来建立一个测试包,PL/SQL里包的概念类似于面向对象里的类的概念,包将一组操作和属性封装在一起,不仅增强了程序的模块化,而且由于封装了更多的操作和属性而提高了执行效能。建立一个PL/SQL需要两个步骤:首先要建立包头,类似于建立一个类的头文件,里面主要对包中的过程,函数和变量的声明;第二部分主要是包体部分,实现前面声明的过程和函数,另外还需要对包进行初始化等工作。

  根据这一思路,建立测试包如下:

/*包头部分*/
create or replace package debug as
procedure debug(v_description varchar2,v_valueOfvariable varchar2)
 procedure reset;
 v_numberOfLine number;
end debug;
/*包体部分*/
create or replace package body debug as
procedure debug(v_description varchar2,v_valueOfvariable varchar2) is
begin
 insert into debugtable
 values(v_numberOfLine,v_description,v_valueOfvariable);
 v_numberOfLine:=v_numberOfLine+1;
end debug;
procedure reset is
begin
 v_numberOfLine:=1;
 delete from debugtable;
end reset;
/*初始化部分*/
begin
 reset;
end debug;

  三.小结

  综合前面对4个问题的解答,基本把PL/SQL的主要部分融会进来了,虽然很多地方只是涉及到比较粗浅的层次,但是有了这一基础,深入下去也是不难的。

  总之,PL/SQL编程与其他语言编程有一定的区别,读者只有把握好其特点才能更好的掌握数据库开发的方面知识。


天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • Oracle PL/SQL入门之慨述
  • Oracle RMAN快速入门指南
  • Oracle建立二进制文件索引的方法
  • Oracle中三种上载文件技术
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle数据操作和控制语言详解
  • 使用Oracle实现实时通信
  • 解析Oracle 8i/9i的计划稳定性
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索