`
jonsamwang
  • 浏览: 37081 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

OraclePL/SQL面试题

阅读更多

一、    求1-100之间的素数
declare
fag boolean:=true;
begin
for i in 1..100 loop
for j in 2..i-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 < '01-6月-81' then
       update emp set sal = sal * 1.1 where empno = c1rec.empno;
    else
       update emp set sal = sal * 1.05 where empno = c1rec.empno;    
    end if;
  end loop;
end;
三、    根据员工在各自部门中的工资高低排出在部门中的名次(允许并列).
<1>  一条SQL语句
   select deptno,ename,sal,(select count(*) + 1
from emp where deptno = a.deptno
and sal > a.sal) as ord
from emp a
order by deptno,sal desc;

<2> PL/SQL块
declare 
  cursor cc is
    select * from dept;
  ccrec cc%rowtype;

  cursor ck(no number) is
    select * from emp where deptno = no order by sal desc;

  ckrec ck%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 then
       raise_application_error(-20001,'修改后的薪金要大于修改前的薪金');
  elsif :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 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
Empno=i.empno
DBMS_OUTPUT.PUT_LINE(i.sal);
END IF;
END LOOP;
END;
/
八、显示EMP中的第四条记录。
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;
/
九、.编写一个给特殊雇员加薪10%的过程,这之后,检查如果已经雇佣该雇员超过60个月,则给他额外加薪3000.
CREATE OR REPLACE PROCEDURE Raise_Sal(no IN NUMBER) AS
vhiredate DATE;
vsal emp.sal%TYPE;
BEGIN
SELECT hiredate,sal INTO vhiredate,vsal FROM emp WHERE empno=no;
IF MONTHS_BETWEEN(SYSDATE,vhiredate)>60 THEN
vsal:=NVL(vsal,0)*1.1+3000;
ELSE
vsal:=NVL(vsal,0)*1.1;
END IF;
UPDATE emp SET sal=vsal WHERE empno=no;
END;
/
VARIABLE no NUMBER
BEGIN
:no:=7369;
END;
/
十、编写一个函数以检查所指定雇员的薪水是否有效范围内。不同职位的薪水范围为:
Designation Raise
Clerk 1500-2500
Salesman 2501-3500
Analyst 3501-4500
Others 4501 and above.
如果薪水在此范围内,则显示消息"Salary is OK",否则,更新薪水为该范围内的最水值。
CREATE OR REPLACE FUNCTION Sal_Level(no emp.empno%TYPE) RETURN CHAR AS
vjob emp.job%TYPE;
vsal emp.sal%TYPE;
vmesg CHAR(50);
BEGIN
SELECT job,sal INTO vjob,vsal FROM emp WHERE empno=no;
IF vjob=´CLERK´ THEN
IF vsal>=1500 AND vsal<=2500 THEN
vmesg:=´Salary is OK.´;
ELSE
vsal:=1500;
vmesg:=´Have updated your salary to ´||TO_CHAR(vsal);
END IF;
ELSIF vjob=´SALESMAN´ THEN
IF vsal>=2501 AND vsal<=3500 THEN
vmesg:=´Salary is OK.´;
ELSE
vsal:=2501;
vmesg:=´Have updated your salary to ´||TO_CHAR(vsal);
END IF;
ELSIF vjob=´ANALYST´ THEN
IF vsal>=3501 AND vsal<=4500 THEN
vmesg:=´Salary is OK.´;
ELSE
vsal:=3501;
vmesg:=´Have updated your salary to ´||TO_CHAR(vsal);
END IF;
ELSE
IF vsal>=4501 THEN
vmesg:=´Salary is OK.´;
ELSE
vsal:=4501;
vmesg:=´Have updated your salary to ´||TO_CHAR(vsal);
END IF;
END IF;
UPDATE emp SET sal=vsal WHERE empno=no;
RETURN vmesg;
END;
/
DECLARE
vmesg CHAR(50);
vempno emp.empno%TYPE;
BEGIN
vempno:=&empno;
vmesg:=Sal_Level(vempno);
DBMS_OUTPUT.PUT_LINE(vmesg);
END;
/
--SELECT empno,ename,sal,comm,hiredate FROM emp WHERE empno=:no;


十二、有如下MyTable:
日期 日产
1    3.3333
2    4.2222
3    1.5555
4    9.8888
5 ………
要求用SQL语句生成如下查询
日期 日产     累计日产
1    3.3333   3.3333
2    4.2222   7.5555
3    1.5555   9.0000
4    9.8888   18.8888
5………
select id,quantity,(select sum(quantity)from mytable where id<=t.id) as acount from mytable t

十三、创建一个序列,第一次从5循环到10,以后再从0开始循环
create sequence test_seq
     start with 5
     increment by 1
     maxvalue 10
     minvalue 0
     cycle
     nocache

0
0
分享到:
评论

相关推荐

    ORACLE PL-SQL超经典面试题

    以上是Oracle PL/SQL面试中可能会遇到的关键概念和操作,涵盖了数据库备份恢复、性能优化、数据存储结构、表管理、索引应用等多个方面。理解和掌握这些知识点对于成为一名合格的Oracle数据库管理员至关重要。

    ORACLE_PL-SQL超经典面试题

    【Oracle PL/SQL 面试题解析】 面试题一:报表中增加保险描述 此题主要考察对数据库联接(JOIN)操作的理解和应用。题目要求在Patient表和Insurance表之间进行联接,以获取每个病人ID对应的保险描述。Patient表...

    PL/sql 面试题

    ### PL/SQL 面试题解析 #### 题目1 **题目描述**: 根据以下表的数据,预测两个查询语句的结果。 **表格数据**: - `usertable` 表: - USERID: 1, USERNAME: user1 - USERID: 2, USERNAME: null - USERID: 3, ...

    Oracle PL SQL 开发人员试题(DBA)

    本资源是 Oracle PL/SQL 开发人员试题(DBA),涵盖了多个与 Oracle PL/SQL 相关的试题,旨在考察开发人员对 Oracle PL/SQL 的理解和应用能力。以下是对试题的详细解读和知识点总结: 题目 1 该题目考察了对子查询和...

    ORACLE PL-SQL面试题

    7. **其他PL/SQL面试题可能涵盖的知识点**: - **游标(Cursors)**:用于逐行处理查询结果,常用于循环和条件判断。 - **异常处理(Exception Handling)**:用`BEGIN...EXCEPTION...END`结构处理程序运行时的错误。 ...

    ORACLE PL-SQL经典面试题

    以上内容涵盖了Oracle PL/SQL面试中常见的技术点,包括数据库基础、数据类型、异常处理、表关系、存储过程、网络配置、备份恢复策略等多个方面。理解并掌握这些知识点对于成为一名合格的Oracle DBA至关重要。

    2010版 - PL SQL 面试题

    标题 "2010版 - PL SQL 面试题" 提及的是针对Oracle数据库的PL/SQL编程语言的一系列面试问题,这对于准备DBA(数据库管理员)考试或求职面试的人员来说是至关重要的。PL/SQL是Oracle数据库的内置过程语言,结合了SQL...

    Oracle PL-SQL 中联模拟笔试题

    Oracle PL-SQL是一种强大的数据库编程语言,用于在Oracle数据库环境中创建和管理复杂的...记住,实践是检验理论的最好方式,通过这些模拟笔试题,你可以不断锻炼自己的技能,为真实的Oracle PL-SQL面试或工作做好准备。

    C++/Java/C#/SQL 面试题 答案

    这份压缩包文件包含了这些领域的面试题及答案,对于准备面试或自我提升有着极大的价值。以下是这些关键知识点的详细解析: 1. **C++**:C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程...

    2024 SQL面试题二

    根据给定文件的信息,我们可以提炼出以下关于Oracle PL/SQL编程的重要知识点: ### 1. PL/SQL 程序设计简介 - **背景**:SQL语言主要用于访问和操作数据库,但缺乏流程控制能力,因此不适合用于应用软件的开发。...

    plsql使用文档

    同时,"面试题"部分则可能涵盖常见的PL/SQL面试问题,如性能优化、并发控制、事务管理等,这对于求职者准备面试非常有帮助。 总之,PL/SQL是Oracle数据库开发的核心技能之一,理解和熟练使用PL/SQL不仅可以提升...

    sql面试题\oracle面试题目

    ### SQL与Oracle面试知识点解析 #### 1. 冷备份与热备份的不同点及各自的优点 - **冷备份**:通常在数据库完全关闭的情况下进行,适用于全盘备份。其主要优点在于备份速度快、数据一致性高,恢复过程简单快速。缺点...

    Oracle经典面试题(个人精心收集,值得收藏)

    本资料集合了多年以来个人精心收集的Oracle经典面试题,旨在帮助求职者或数据库管理员更好地准备面试,理解Oracle数据库的核心概念和技术。 1. **SQL基础** - SQL(Structured Query Language)是用于管理关系...

    oracle企业面试题集锦.pdf

    "Oracle企业面试题集锦.pdf" Oracle 企业面试题集锦旨在为应试者提供一个系统的 Oracle 面试题集锦,涵盖了 Oracle 的各种知识点,从宏观到微观,全面介绍了 Oracle 的特点、优点和使用方法。 一、Oracle 和 SQL ...

    Oracle面试题

    - 脚本语言:Oracle使用PL-SQL,SQL Server使用T-SQL,两者语法和功能有区别。 - 在数据类型、数据库结构等方面也存在细微差别,如Oracle支持更多自定义类型和分区功能。 3. **Oracle的Function与Procedure**: ...

    Oracle数据库DBA面试题50道及答案.pdf

    以下是针对给定的Oracle数据库DBA面试题的知识点详细解析: 1. **冷备份和热备份的区别及其优点**: - **热备份**:在数据库运行时(归档模式下)进行备份。优点是可以使用数据库,且可将数据库恢复到任意时间点。...

    oracle数据工程师面试题.pdf

    "oracle数据工程师面试题.pdf" 本资源是一个Oracle数据工程师面试题库,涵盖了多个关于Oracle数据库管理和开发的问题。下面是从文件中提取的知识点: 1. 数据类型和操作 * varchar2数据类型:varchar2是Oracle中...

    Oracle企业面试题集锦

    以上就是从提供的信息中总结出的Oracle企业面试题集锦中的核心知识点,涵盖了Oracle与SQL Server的区别、Oracle特性、数据库管理、性能优化等多个方面。这些知识点对于深入理解和掌握Oracle数据库的使用和管理具有...

    oracle笔试和面试题

    本资源摘要信息涵盖了 Oracle 相关的笔试和面试题,包括表连接方式、SQL 执行计划、CBO 和 RULE 的区别等多个方面的知识点。 表连接方式: * Inner Join: Inner Join 用于连接两个表,并返回满足连接条件的记录。...

    Oracle常见面试题

    以下是一些关于Oracle常见面试题的知识点,这些知识点对于理解Oracle数据库的核心概念、功能和最佳实践至关重要。 1. **Oracle数据库版本与组件**:了解Oracle的不同版本(如Standard Edition、Enterprise Edition...

Global site tag (gtag.js) - Google Analytics