几十个实用的PL/SQL(3)

第三阶段

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

       (

         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;

              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;

 

       --插入记录

       DBMS_OUTPUT.PUT_LINE('插入记录:');

       vemp(i).empno:=1000;

       vemp(i).ename:='Goldens';

       vemp(i).job:='Software';

       vemp(i).mgr:=null;

       vemp(i).hiredate:='2003-01-04';

       vemp(i).sal:=8888;

       vemp(i).comm:=10;

       vemp(i).deptno:=10;

      

       FOR j IN 1..i

       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;

       --删除第5、6条记录

       DBMS_OUTPUT.PUT_LINE('删除第5、6条记录:');

       FOR j IN 5..i-2

       LOOP

              vemp(j).empno:=vemp(j+2).empno;

              vemp(j).ename:=vemp(j+2).ename;

              vemp(j).job:=vemp(j+2).job;

              vemp(j).mgr:=vemp(j+2).mgr;

              vemp(j).hiredate:=vemp(j+1).hiredate;

              vemp(j).sal:=vemp(j+2).sal;

              vemp(j).comm:=vemp(j+2).comm;

              vemp(j).deptno:=vemp(j+2).deptno;

       END LOOP;

       vemp(i-1).empno:=null;

       vemp(i-1).ename:=null;

       vemp(i-1).job:=null;

       vemp(i-1).mgr:=null;

       vemp(i-1).hiredate:=null;

       vemp(i-1).sal:=null;

       vemp(i-1).comm:=null;

       vemp(i-1).deptno:=null;

       vemp(i).empno:=null;

       vemp(i).ename:=null;

       vemp(i).job:=null;

       vemp(i).mgr:=null;

       vemp(i).hiredate:=null;

       vemp(i).sal:=null;

       vemp(i).comm:=null;

       vemp(i).deptno:=null;

 

       FOR j IN 1..i-2

       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;

/

时间: 2024-08-01 12:32:52

几十个实用的PL/SQL(3)的相关文章

几十个实用的PL/SQL(2)

  第二阶段 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         

几十个实用的PL/SQL(1)

这是我在ACCP学习的QA,觉得对初学者很有帮助,贴出. ---- 第一阶段 Q.编写一个PL/SQL程序块以显示所给出雇员编号的雇员的详细信息. A.  DECLARE        erec emp%ROWTYPE; BEGIN        SELECT * INTO erec FROM emp        WHERE empno=&雇员编号;        DBMS_OUTPUT.PUT_LINE('EmpNo' || ' ' || 'Ename' || ' '|| 'Job' ||

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

初学 第一阶段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' || '

几十个实用的PL/SQL(4)

第四阶段 Q.编写一过程以接受用户输入的三个部门编号并显示其中两个部门编号的部门名称. A. CREATE OR REPLACE PROCEDURE DeptName(no1 dept.deptno%TYPE,no2 dept.deptno%TYPE,no3 dept.deptno%TYPE) AS        vflag NUMBER;        vdeptno1 dept.deptno%TYPE;        vdeptno2 dept.deptno%TYPE;        vdn

几十个实用的PL/SQL(5)

第五阶段 Q.编写一个数据包,它有两个函数和两个过程以操作"emp"表.   该数据包要执行的任务为:    插入一个新雇员:删除一个现有雇员:显示指定雇员的整体薪水(薪水+佣金):显示指定雇员所在部门名称. A. CREATE OR REPLACE PACKAGE emppack AS        PROCEDURE insrec(pempno emp.empno%TYPE,pename emp.ename%TYPE,                                

实用的备份PL/SQL程序工具

备份|程序 /*ligang1000@hotmail.com*/   功能: 用于备份当前用户所拥有的所有PL/SQL objects (包括 TYPE,TYPE BODY, PROCEDURE , FUNCTION, PACKAGE, PACKAGE BODY or JAVA SOURCE )   原理: 对USER_SOURCE数据字典的调用,得到所有的 PL/SQL 代码.   使用方法举例: 1.     在C盘建立目录C:\EXPORT 2.     将EXPORT_SOURCE.SQ

PL/SQL DEVELOPER 6对象比较功能说明(原创)

比较|对象|原创 PL/SQL DEVELOPER 6对象比较功能说明(原创)   PL/SQL DEVELOPER 6的对象比较功能非常强大与实用,对于开发人员来说是一个必备的工具,主要有以下用途: 检查两个不同数据库间某个用户下所有对象的不同信息 自动生成用来匹配的SQL脚本 常用于开发数据库与生成数据库对比或者新版数据库与旧数据库   下面我将全面介绍PL/SQL DEVELOPER 6对象比较功能的操作步骤: 1.打开窗口 打开Tools/Compare User Objects-菜单,

PL/SQL实现Oracle数据库任务调度

oracle|数据|数据库 在数据库操作中时常会有这样的情况发生,由于一时的疏忽而误删或误改了一些重要的数据,另外还有一些重要的任务需要周期性地运行.显然,前一类问题主要是数据备份与恢复方面的,而后一类则主要是系统的任务调度.本文将针对这两类问题,从应用程序开发角度给出一个解决方法. 一.技术基础 由于本文是使用PL/SQL作为开发平台来提供解决方案,所以首先了解相关的背景知识. PL/SQL本身只是作为SQL语句的一个补充,通过引入过程化的概念来增强数据库处理能力.然而,相对于C,C++,JA

《Oracle PL/SQL程序设计(第5版)》一一1.5 PL/SQL开发人员的资源

1.5 PL/SQL开发人员的资源 Oracle PL/SQL程序设计(第5版) O'Reilly在1995年出版了本书的第一版.当时,Oracle PL/SQL编程这本书确实造成一个小轰动.它是第一本关于PL/SQL的独立著作(也就是,不是来自于Oracle公司的).从那时开始,PL/SQL程序员的资源─图书.开发环境.工具以及网站─开始蓬勃发展.(当然,迄今为止这本书仍然是这些资源中最重要和最有价值的!) 下面这一节简要地介绍了这许多资源.要充分利用这些资源,许多资源都可以免费获得或者非常低