网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > PL/SQL > PL/SQL初学者必读:几十个实用的PL/SQL  

PL/SQL初学者必读:几十个实用的PL/SQL

2003-07-12  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  第一阶段
  Q.编写一个PL/SQL程序块以显示所给出雇员编号的雇员的详细信息。
  A.
   DECLARE
   erec emp%ROWTYPE;
  BEGIN
   SELECT * INTO erec FROM emp WHERE empno=&雇员编号;
   DBMS_OUTPUT.PUT_LINE('EmpNo' || ' ' || 'Ename' || ' '|| 'Job' || ' ' || 'Manager' || ' ' || 'HireDate' || ' ' || 'Salary' || ' ' || 'Commision' || ' ' || 'DeptNo');
   DBMS_OUTPUT.PUT_LINE(erec.ename || ' ' || erec.job || ' ' || erec.mgr || ' ' ||erec.hiredate || ' ' || erec.sal || ' ' || erec.comm || ' ' || erec.deptno);
  END;
  /
  Q.编写一个PL/SQL程序块以计算某个雇员的年度薪水总额。
  A.
  DECLARE
   esal NUMBER;
   eename emp.ename%TYPE;
  BEGIN
   SELECT (NVL(sal,0)+NVL(comm,0))*12,ename INTO esal,eename FROM emp WHERE empno=&雇员编号;
   DBMS_OUTPUT.PUT_LINE(eename || '''s Years Salary is ' || esal);
  END;
  /
  Q.按下列加薪比执行:
   Deptno Raise(%age)
  10 5%
  20 10%
  30 15%
  40 20%
  加薪的百分比是以他们现有的薪水为根据的。写一PL/SQL以对指定雇员加薪。 中国网管联盟bitsCN.com
  A.
  DECLARE
   vcounter NUMBER:=10;
   vraise NUMBER;
  BEGIN
   LOOP
   EXIT WHEN vcounter>40;
   UPDATE emp set sal=NVL(sal,0)+NVL(sal,0)*0.05 WHERE deptno=vcounter;
   vcounter:=vcounter+10;
   END LOOP;
  END;
  /
  
  Q.编写一PL/SQL以向"emp"表添加10个新雇员编号。
  (提示:如果当前最大的雇员编号为7900,则新雇员编号将为7901到7910)
  A.
  DECLARE
   vcounter NUMBER;
  BEGIN
   SELECT MAX(empno) INTO vcounter FROM emp;
   FOR i IN 1..10
   LOOP
   vcounter:=vcounter+1;
   INSERT INTO emp(empno) VALUES(vcounter);
   END LOOP;
  END;
  /
  Q.只使用一个变量来解决实验课作业4。
  A
  DECLARE
   erec emp%ROWTYPE;
  -- vraise NUMBER;
  BEGIN
   SELECT * INTO erec
   FROM emp
   WHERE ename='&ename';
   IF erec.job='CLERK' THEN
   UPDATE emp SET sal=sal+500 WHERE empno=erec.empno;
   ELSIF erec.job='SALESMAN' THEN
网管联盟bitsCN_com

   UPDATE emp SET sal=sal+1000 WHERE empno=erec.empno;
   ELSIF erec.job='ANALYST' THEN
   UPDATE emp SET sal=sal+1500 WHERE empno=erec.empno;
   ELSE
   UPDATE emp SET sal=sal+2000 WHERE empno=erec.empno;
   END IF;
  -- UPDATE emp SET sal=sal+vraise WHERE empno=erec.empno;
  -- DBMS_OUTPUT.PUT_LINE(vraise);
  END;
  /
  Q.接受两个数相除并且显示结果。如果第二个数为0,则显示消息"DIVIDE BY ZERO"。
  A.
  DECLARE
   num1 NUMBER;
   num2 NUMBER;
  BEGIN
   num1:=#
   num2:=#
   DBMS_OUTPUT.PUT_LINE(num1 || '/' || num2 || ' is ' || num1/num2);
  EXCEPTION
   WHEN ZERO_DIVIDE THEN
   DBMS_OUTPUT.PUT_LINE('Didn''t your teacher tell you not to DIVIDE BY ZERO?');
  END;
  /
  
  
  第二阶段
  Q.编写一个PL/SQL程序块,对名字以"A"或"S"开始的所有雇员按他们的基本薪水的10%加薪。
  A.
  DECLARE
   CURSOR c1 IS
   SELECT * FROM emp WHERE SUBSTR(ename,1,1)='A' OR SUBSTR(ename,1,1)='S' FOR UPDATE OF sal; 网管bitscn_com
  
  BEGIN
   FOR i IN c1
   LOOP
   UPDATE emp SET sal=NVL(sal,0)+NVL(sal,0)*0.1 WHERE CURRENT OF c1;
   END LOOP;
  END;
  /
  Q.编写一PL/SQL,对所有的"销售员"(SALESMAN)增加佣金500.
  A.
  DECLARE
   CURSOR c1 IS
   SELECT * FROM emp WHERE job='SALESMAN' FOR UPDATE OF sal;
  BEGIN
   FOR i IN c1
   LOOP
   UPDATE emp SET sal=NVL(sal,0)+500 WHERE CURRENT OF c1;
   END LOOP;
  END;
  /
  Q.编写一PL/SQL,以提升两个资格最老的"职员"为"高级职员"。(工作时间越长,优先级越高)
  A.
  DECLARE
   CURSOR c1 IS
   SELECT * FROM emp WHERE job='CLERK' ORDER BY hiredate FOR UPDATE OF job;
   --升序排列,工龄长的在前面
  
  BEGIN
   FOR i IN c1
   LOOP
   EXIT WHEN c1%ROWCOUNT>2;
   DBMS_OUTPUT.PUT_LINE(i.ename);
   UPDATE emp SET job='HIGHCLERK' WHERE CURRENT OF c1;
   END LOOP;
  END;
  /
  Q.编写一PL/SQL,对所有雇员按他们基本薪水的10%加薪,如果所增加的薪水大于5000,则取消加薪。 中国网管联盟bitsCN.com
  A.
  DECLARE
   CURSOR c1 IS SELECT * FROM emp FOR UPDATE OF sal;
  
  BEGIN
   FOR i IN c1
   LOOP
  
   IF (i.sal+i.sal*0.1)<=5000 THEN
   UPDATE emp SET sal=sal+sal*0.1 WHERE CURRENT OF c1;
   DBMS_OUTPUT.PUT_LINE(i.sal);
   END IF;
  
   END LOOP;
  END;
  /
  Q.显示EMP中的第四条记录。
  A.
  DECLARE
   CURSOR c1 IS SELECT * FROM emp;
  
  BEGIN
   FOR i IN c1
   LOOP
   IF c1%ROWCOUNT=4 THEN
   DBMS_OUTPUT.PUT_LINE(i. EMPNO || ' ' ||i.ENAME || ' ' || i.JOB || ' ' || i.MGR || ' ' || i.HIREDATE || ' ' || i.SAL || ' ' || i.COMM || ' ' || i.DEPTNO);
   EXIT;
   END IF;
   END LOOP;
  END;
  /
  
  
  第三阶段
  Q.使用REF游标显示"EMP"表中的值。
  A.
  DECLARE
   TYPE emprectyp IS RECORD
   (
   EMPNO emp.empno%TYPE,
   ENAME emp.ename%TYPE,
   JOB emp.job%TYPE,
网管网www.bitscn.com

   MGR emp.mgr%TYPE,
   HIREDATE emp.hiredate%TYPE,
   SAL emp.sal%TYPE,
   COMM emp.comm%TYPE,
   DEPTNO emp.deptno%TYPE
   );
   TYPE emp_cursor IS REF CURSOR RETURN emp%ROWTYPE;
   vemp_cur EMP_CURSOR;
   vemp_rec EMPRECTYP;
  BEGIN
   OPEN vemp_cur FOR SELECT * FROM emp;
   LOOP
   FETCH vemp_cur INTO vemp_rec;
   EXIT WHEN vemp_cur%NOTFOUND;
   DBMS_OUTPUT.PUT(vemp_rec.empno||' '||vemp_rec.ename||' '||vemp_rec.job);
   DBMS_OUTPUT.PUT(vemp_rec.mgr||' '||vemp_rec.hiredate||' '||vemp_rec.sal);
   DBMS_OUTPUT.PUT_line(vemp_rec.comm||' '||vemp_rec.deptno);
   END LOOP;
   CLOSE vemp_cur;
  END;
  /
  Q.从"EMP"中获得值送到PL/SQL表,将PL/SQL表中的薪水值增加500,并向用户显示增加的薪水及其他详细信息。
  A.
  DECLARE
   TYPE emprec IS RECORD
   (
   EMPNO emp.empno%TYPE,
   ENAME emp.ename%TYPE,
   JOB emp.job%TYPE,
网管联盟bitsCN_com

   MGR emp.mgr%TYPE,
   HIREDATE emp.hiredate%TYPE,
   SAL emp.sal%TYPE,
   COMM emp.comm%TYPE,
   DEPTNO emp.deptno%TYPE
   );
  
   i BINARY_INTEGER:=1;
  
   TYPE emp_tab IS TABLE OF EMPREC INDEX BY binary_integer;
   vemp EMP_TAB;
  
   CURSOR c1 IS SELECT * FROM emp;
  BEGIN
   FOR x IN c1
   LOOP
   vemp(i).empno:=x.empno;
   vemp(i).ename:=x.ename;
   vemp(i).job:=x.job;
   vemp(i).mgr:=x.mgr;
   vemp(i).hiredate:=x.hiredate;
   vemp(i).sal:=x.sal+500;
   vemp(i).comm:=x.comm;
   vemp(i).deptno:=x.deptno;
   i:=i+1;
   END LOOP;
  
   FOR j IN 1..i-1
   LOOP
   DBMS_OUTPUT.PUT(vemp(j).empno||' '||vemp(j).ename||' '||vemp(j).job);
   DBMS_OUTPUT.PUT(vemp(j).mgr||' '||vemp(j).hiredate||' '||vemp(j).sal);
   DBMS_OUTPUT.PUT_line(vemp(j).comm||' '||vemp(j).deptno);
  
   END LOOP;
  END;
  /
网管u家u.bitscn@com

  Q.一旦将值送到PL/SQL表后,尝试在PL/SQL表中插入新记录并且删除某些现有的记录。
  A.
  DECLARE
   TYPE emprec IS RECORD
   (
   EMPNO emp.empno%TYPE,
   ENAME emp.ename%TYPE,
   JOB emp.job%TYPE,
   MGR emp.mgr%TYPE,
   HIREDATE emp.hiredate%TYPE,
   SAL emp.sal%TYPE,
   COMM emp.comm%TYPE,
   DEPTNO emp.deptno%TYPE
   );
  
   i BINARY_INTEGER:=1;
  
   TYPE emp_tab IS TABLE OF EMPREC INDEX BY binary_integer;
   vemp EMP_TAB;
  
   CURSOR c1 IS SELECT * FROM emp;
  BE

TAGs实用   几十   必读   学者   vemp   Q.   DECLARE   BEGIN   A.   sal   END    
 上一篇:如何在SQL *Plus中把数据库栏以变量的形式保存   下一篇:在UNIX下让ORACLE定时执行*.sql文件
相关文章列表
PL/SQL初学者必读:几十个实用的PL/SQL 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.PL/SQL循序渐进全面学习教程--Oracle
2.详细介绍ORACLE sqlplus命令
3.神秘的 ORACLE DUAL
4.Oracle PL/SQL语言基础
5.如何使用Oracle case函数
6.ORACLE的PL/SQL二
7.PL/SQL学习笔记(一)
8.数据库手册:速查Oracle函数列表
9.新手学习之Oracle trunc()函数的用法
10.oracle数据库中sql基础
最新推荐文章:
1.与数据库无关的处理放到数据库以外来实现
2.Oracle 10g第2版新特性之SQL和PL/SQL
3.通过PL/SQL访问Web Services
4.菜鸟学oracle - 用PL/SQL画直方图
5.重新编译PLSQL中无效对象或指定对象
6.Oracle高级技巧
7.深入了解Oracle 10g新的多重集运算符
8.在SQL中删除重复记录(多种方法)
9.Oracle:PL/SQL中怎样使用Array
10.数据库手册:速查Oracle函数列表
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的