存储过程oracle面试,oracle-plsq存储过程l面试题

41528d3028836879cd698677c3999917.giforacle-plsq存储过程l面试题

OraclePL/SQL 面试题 一、 求 1-100 之间的素数 declare fag boolean:=true; begin for i in 1100 loop for j in 2i-1 loop if mod(i,j)=0 then fag:=false; end if; end loop; if fag then dbms_output.put_line(i); end if; fag:=true; end loop; end; 二、 对所有员工,如果该员工职位是 MANAGER,并且在 DALLAS 工作那么就给他薪金加 15%;如果该员工职位是 CLERK,并且在 NEW YORK 工作那么就给他薪金扣除 5%;其他情 况不作处理 declare cursor c1 is select * from emp; c1rec c1%rowtype; v_loc varchar2(20); begin for c1rec in c1 loop select loc into v_loc from dept where deptno = c1rec.deptno; if c1rec.job = MANAGER and v_loc = DALLAS then update emp set sal = sal * 1.15 where empno = c1rec.empno; elsif c1rec.job= CLERK and v_loc = NEW YORK then update emp set sal = sal * 0.95 where empno = c1rec.empno; else null; end if; end loop; end; 三、对直接上级是 BLAKE 的所有员工,按照参加工作的时间加薪:81 年 6 月以前的加薪 10% 81 年 6 月以后的加薪 5% declare cursor c1 is select * from emp where mgr = (select empno from emp where ename= BLAKE ); -- 直接上级是 BLAKE 的所有员工 c1rec c1%rowtype; begin for c1rec in c1 loop if c1rec.hiredate 一条 SQL 语句select deptno,ename,sal,(select count(*) + 1 from emp where deptno = a.deptno and sal>a.sal) as ord from empa order by deptno,saldesc; PL/SQL 块 declare cursor cc is select * from dept; ccreccc%rowtype; cursor ck(no number) is select * from emp where deptno = no order by saldesc; ckrecck%rowtype; i number; j number; v_sal number:=-1; begin for ccrec in cc loop i := 0; for ckrec in ck(ccrec.deptno) loop i := i + 1; -- 写入临时表if ckrec.sal = v_sal then null; else j:=i; end if; -- 显示DBMS_OUTPUT.put_line(ccrec.deptno||chr(9)||ccrec.ename||chr(9)||ckrec.sal||chr(9)||j); v_sal := ckrec.sal; end loop; end loop; end; 四、编写一个触发器实现如下功能:对修改职工薪金的操作进行合法性检查:a) 修改后的薪金要大于修改前的薪金b) 工资增量不能超过原工资的 10% c) 目前没有单位的职工不能涨工资 create or replace trigger tr1 after update of sal on emp for each row begin if :new.sal :old.sal * 1.1 then raise_application_error(-20002, 工资增量不能超过原工资的 10% ); elsif :old.deptno is null then raise_application_error(-20003, 没有单位的职工不能涨工资 ); end if; end; 四、 编写一个 PL/SQL 程序块,对名字以“A“ 或“S“ 开始的所有雇员按他们的基本薪水的 10%加薪。 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; / 五、编写一 PL/SQL,对所有的“销售员“(SALESMAN) 增加佣金 500. 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; / 六、编写一 PL/SQL,以提升两个资格最老的“职员“ 为“ 高级职员“ 。 (工作时间越长,优先级 越高) 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; / 七、编写一 PL/SQL,对所有雇员按他们基本薪水的 10%加薪,如果所增加的薪水大于 5000,则取消加薪。 DECLARE CURSOR c1 IS SELECT * FROM emp FOR UPDATE OF

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值