A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄文伯 于 2013-5-17 12:56 编辑

数据源:
  1. --表emp:
  2. DROP TABLE emp PURGE;
  3. CREATE TABLE emp(
  4.         empno        NUMBER(4),
  5.         ename        VARCHAR2(10),
  6.         job        VARCHAR2(9),
  7.         mgr        NUMBER(4),
  8.         hiredate        DATE,
  9.         sal        NUMBER(7,2),
  10.         comm        NUMBER(7,2),
  11.         deptno        NUMBER(3)
  12. );
  13. insert into emp values(7369,'SMITH','CLERK',7902,'17-12月-05',800,NULL,20);
  14. insert into emp values(7499,'ALLEN','SALESMAN',7698,'20-2月-02',1600,300,30);
  15. insert into emp values(7521,'WARD','SALESMAN',7698,'22-2月-96',1250,500,30);
  16. insert into emp values(7566,'JONES','MANAGER',7839,'02-4月-09',2975,NULL,20);
  17. insert into emp values(7654,'MARTIN','SALESMAN',7698,'28-9月-10',1250,1400,30);
  18. insert into emp values(7698,'BLAKE','MANAGER',7839,'01-5月-08',2850,NULL,30);
  19. insert into emp values(7782,'CLARK','MANAGER',7839,'09-6月-05',2450,NULL,10);
  20. insert into emp values(7788,'SCOTT','ANALYST',7566,'19-4月-10',3000,NULL,20);
  21. insert into emp values(7839,'KING','PRESIDENT',NULL,'17-11月-11',5000,NULL,10);
  22. insert into emp values(7844,'TURNER','SALESMAN',7698,'08-9月-07',1500,0,30);
  23. insert into emp values(7876,'ADAMS','CLERK',7788,'23-5月-04',1100,NULL,20);
  24. insert into emp values(7900,'JAMES','CLERK',7698,'03-12月-03',950,NULL,30);
  25. insert into emp values(7902,'FORD','ANALYST',7566,'03-12月-07',3000,NULL,20);
  26. insert into emp values(7934,'MILLER','CLERK',7782,'23-1月-09',1300,NULL,10);

  27. --表dept:
  28. DROP TABLE dept PURGE;
  29. CREATE TABLE dept(
  30.         deptno NUMBER(3),
  31.         dname VARCHAR2(14),
  32.         loc VARCHAR2(13)
  33. );
  34. insert into dept values(10,'accounting','new york');
  35. insert into dept values(20,'research','dallas');
  36. insert into dept values(30,'sales','chicago');
  37. insert into dept values(40,'operations','boston');
复制代码
1.游标
为表dept增加一个字段totalPerson,用来记录该部门的总人数
totalPerson int
用游标实现修改各部门的总人数
提示如下:
定义一个游标,名为dept_cursor,数据为select deptno from dept,带for update子句
打开游标开始循环
获取游标所指的当前记录的部门编号
在表emp中查询当前部门编号的员工人数
用游标修改dept表中记录的totalPerson字段
循环结束,关闭游标
查看表dept中字段totalPerson的数据是否正确

2.存储过程
查询指定员工编号所在的部门名称
要求使用IN/OUT型参数
处理异常:
当no_data_found时,给出'no data'的信息提示
其他异常时,给出'unkown error'的信息提示
3.函数
编写一个函数求a, b, c的最大值
其功能是:对输入的3个参数比较大小,输出最大的参数
函数中需有异常处理:
若3个参数的值<0则提示错误信息
十分感谢!


评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2

查看全部评分

10 个回复

倒序浏览

回帖奖励 +10

先拿你10个金币   {:soso_e151:}    问题提的不错    非常好
回复 使用道具 举报
袁梦希 发表于 2013-5-16 21:26
先拿你10个金币       问题提的不错    非常好

会做的话麻烦把结果贴出来哈
回复 使用道具 举报
  1. ALTER TABLE  dept ADD(totalPerson INT);
  2. DECLARE
  3.         --定义REF游标
  4.   TYPE refcursor IS REF CURSOR;
  5.   --定义一个具体的ref游标
  6.   dept_cursor refcursor;  
  7.   --部门编号
  8.         v_deptno NUMBER;
  9.         --总人数
  10.   v_count NUMBER;
  11. BEGIN
  12.         OPEN dept_cursor FOR 'SELECT deptno,COUNT(*) FROM emp GROUP BY deptno';
  13.         LOOP
  14.           --下移游标,并读取数据
  15.                 FETCH dept_cursor INTO v_deptno,v_count;               
  16.                 UPDATE dept SET totalPerson=v_count WHERE deptno=v_deptno;
  17.                 --判断是否退出
  18.                 EXIT WHEN dept_cursor%NOTFOUND;
  19.                  --打印数据
  20.     DBMS_OUTPUT.PUT_LINE(v_deptno||' '||v_count);
  21.   END LOOP;
  22.   CLOSE dept_cursor;
  23. END;
  24. /
  25. SELECT deptno,totalPerson FROM dept ;
复制代码
  1. create or replace
  2.         procedure query_dept(v_empno number,p_dname out dept.dname%type)
  3.         as
  4.         begin
  5.                 select dept.dname into p_dname from emp inner join dept on dept.deptno = emp.deptno where empno = v_empno;
  6.                 dbms_output.put_line(p_dname);
  7.                 exception
  8.                         when no_data_found then
  9.                                 dbms_output.put_line('no data');
  10.                         when others then dbms_output.put_line('unknown error');
  11.         end;
  12. /
  13. --调用
  14.         declare
  15.         p_dname  dept.dname%type;
  16.         begin
  17.                 query_dept('&v_empno',p_dname);
  18.         end;
  19. /
复制代码
  1. CREATE OR REPLACE FUNCTION getMax(a NUMBER,b NUMBER,c NUMBER) RETURN VARCHAR2
  2. IS max1 VARCHAR2(50);
  3.         --exception1 EXCEPTION;
  4.         v_char VARCHAR2(50);
  5. BEGIN
  6.         v_char :='请输入正数';
  7.         IF a<0 OR b<0 OR c< 0
  8.                 THEN max1 := v_char;
  9.         ELSE
  10.   IF a > b THEN
  11.     IF a > c THEN
  12.       max1 := a;
  13.     ELSE
  14.       max1 := c;
  15.     END IF;
  16.   ELSE
  17.     IF b > c THEN
  18.       max1 := b;
  19.     ELSE
  20.       max1 := c;
  21.     END IF;
  22.   END IF;
  23.   END IF;
  24.   RETURN max1;
  25. END;
复制代码
这是第一种方式
回复 使用道具 举报
  1. ALTER TABLE  dept ADD(totalPerson INT);
  2. declare v_count number;v_deptno number;
  3. cursor dept_cursor is select deptno from dept for update;
  4. begin
  5. open dept_cursor;
  6. loop
  7. fetch dept_cursor into v_deptno;
  8. exit when dept_cursor%notfound;
  9. select count(*) into v_count from emp where deptno=v_deptno;
  10. update dept  
  11. set totalPerson=v_count
  12. where deptno=v_deptno;
  13. end loop;
  14. close dept_cursor;
  15. end;
  16. /
复制代码
  1. set serveroutput on
  2. create or replace procedure query_deptname
  3. (
  4. p_no in emp.empno%type,
  5. p_dname  out dept.dname%type
  6. )
  7. is
  8. begin
  9. select dname into p_dname from emp,dept where emp.deptno=dept.deptno and empno=p_no;
  10. exception
  11. when no_data_found then
  12. dbms_output.put_line('no data');
  13. when others then
  14. dbms_output.put_line('unkown error');
  15. end query_deptname;
  16. /
  17. variable g_dname varchar2(14)
  18. execute query_deptname(7934,:g_dname);
复制代码
  1. set serveroutput on
  2. create or replace function f_max(a number,b number,c number) return number
  3. is
  4. v_num number(8);
  5. begin
  6. if a<0 or b<0 or c<0 then
  7. dbms_output.put_line('请输入三个都大于0的数!');
  8. elsif a>b then
  9. v_num:=a;
  10. else v_num:=b;
  11. end if;
  12. if c>v_num then
  13. v_num:=c;
  14. end if;
  15. return v_num;
  16. end;
  17. /

  18. select f_max(-1,22,3) from dual;
  19. select f_max(998,2,38) from dual;
复制代码
第二种方式 ,希望能测试一下 如果有错误请告诉我一下
回复 使用道具 举报

回帖奖励 +10

楼主在自问自答,犀利啊
回复 使用道具 举报

回帖奖励 +10

表示oracle正在学习当中,不是太懂!
回复 使用道具 举报
神之梦 发表于 2013-5-18 01:22
楼主在自问自答,犀利啊

我一开始是不会做的,等帖子发出来之后竟然会做了,等了一天还没有人回答就把答案贴出来了
回复 使用道具 举报
刘正祥 发表于 2013-5-18 02:13
表示oracle正在学习当中,不是太懂!

韩爷的视频值得好好研究
回复 使用道具 举报
我了个去。。。PL/SQL貌似好犀利啊。。。就看得懂那个查询语句。。。
存储过程。。。杀了我吧。。。。。。
回复 使用道具 举报
Miss小强 发表于 2013-5-19 14:16
我了个去。。。PL/SQL貌似好犀利啊。。。就看得懂那个查询语句。。。
存储过程。。。杀了我吧。。。。。。 ...

慢慢会看懂的,把Oracle学完就专攻Java了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马