转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> Sql Server >> 正文
PL/SQL初学者必读:几十个实用的PL/SQL         

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2385 更新时间:2008/12/14 2:06:02

第一阶段
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以对指定雇员加薪。
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
  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;

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,则取消加薪。
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,
   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,
   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;
/
Q.一旦将值送到PL/SQL表后,尝试在PL/SQL表中插入新记录并且删除某些现有的记录。
A.
DECLARE
 TYPE emprec IS RECORD
 (
 &n

[1] [2] [3]  下一页


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台