oracle习题

Posted 书生的行李

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle习题相关的知识,希望对你有一定的参考价值。

--1.查询员工表中所有员工信息

select * from employees;

--2.查询员工表中员工的员工号、姓名、每个员工涨工资100元以后的年工资(按12个月计算)。

SELECT employee_id, employee_name, salary, (100+salary)*12+(100+salary) *12*commission_pct

FROM   employees;

select * from employees;

--3.查询员工first_namelast_name,要求结果显示为“姓last_namefirst_name”格式。

 SELECT  ''||last_name||''||first_name FROM   employees;

--4.查询所有员工所从事的工作有哪些类型(要求去掉重复值)。

select distinct department_id from employees;

--1.查询员工表中所有员工信息

select * from departments;

--2.使用公式查询所有员工的信息。

select last_name, first_name, salary, hire_date, job_id, department_id from employees;

--3.使用表别名查询所有员工的信息。

select * from employees emp;

--4.使用连接运算符查询所有员工的信息。

select first_name||last_name||'''s salaey'||salary from employees;

--5.使用DISTINCT取消重复行

select distinct job_id from employees;

--1.查询last_name是Chen的员工的信息。

select last_name, salary, department_id from employees where last_name='Chen';

--2.查询参加工作时间在1997-7-9之后,并且不从事IT_PROG工作的员工的信息。

select * from employees where hire_date >= '01-1月-1999' and job_id not in('IT_PROG');

-- 3.查询员工last_name的第三个字母是a的员工的信息。

select *from employees where last_name like'__a%';

--4.查询除了10、20、110号部门以外的员工的信息。

select *from employees where department_id in(10,20,110);

--5.查询部门号为50号员工的信息,先按工资降序排序,再按姓名升序排序。

select * from employees where department_id in(50) order by salary asc,last_name desc;

--6.查询没有上级管理的员工(经理号为空)的信息。

select * from employees where manager_id is null;

--7.查询员工表中工资大于等于4500并且部门为50或者60的员工的姓名(last_name), 工资,部门号。

select last_name, salary,department_id from employees where salary>=4500 and (department_id in 50 or department_id in 60);

--.把字符串’I love SQL’转换成全部小写

select lower('I love SQL')from   dual;

--2.把字符串’I love SQL’转换成全部大写

select upper('I love SQL')from   dual;

--把字符串’I love SQL’转换成每个单词第一个字母大写,其他字母小写

SELECT INITCAP('I love SQL')   FROM   DUAL;

--90号部门中所有员工的信息,要求职位按照小写方式显示

select lower('job_id')job,salary,last_name from employees where department_id=50 ;

--.查询员工的last_name  是King 的信息(使用字符操作函数)

select salary,last_name from employees where upper(last_name)='KING';

--6.查找公司员工编号,用户名(first_name与last_name连接成一个字符串),职位编

--号及last_name的长度,要求职位从第四位起匹配'ACCOUNT',同时last_name中至少包含一个’e’字母

select employee_id,concat(first_name,last_name)name,job_id,length(last_name)length

from employees

where substr(job_id,4)='ACCOUNT'

and instr(last_name,'e')>0;

--7.ROUND、TRUNC、MOD函数的使用

select round(65.478,2),round(65.654,0),round(65.654,-2) from dual;

select trunc(65.478,2),trunc(65.654,0),trunc(65.654,-2) from dual;

 

--8.MONTHS_BETWEEN函数演示——公司员工服务的月数。

 SELECT  last_name, salary, months_between(SYSDATE,hire_date) months

FROM employees

order by months;

 

--9.ADD_MONTHS函数演示——99年公司员工转正日期。

SELECT  last_name, salary, hire_date, ADD_MONTHS(hire_date,3) new_date

FROM  employees

WHERE  hire_date>'01-1月-1999';

 

--10.TO_CHAR函数进行日期到字符型复杂格式转换演示。

SELECT employee_id, last_name,  

TO_CHAR(hire_date,'Day ",the" Ddspth "of" YYYY HH24:MI:SS') hire_date

FROM employees

WHERE  department_id=90;

--1. 计算2000年1月1日到现在有多少月,多少周(四舍五入)。

 select round(months_between(sysdate,to_date('2000.1.1','yyyy.mm.dd'))),

round(sysdate-to_date('2000,1,1','yyyy.mm.dd'))/7 from dual;

--2. 查询员工last_name的第三个字母是a的员工的信息(使用2个函数)。

select last_name from employees where substr(last_name,3,1)='a';

--3. 使用trim函数将字符串‘hello’、‘  Hello ’、‘bllb’、‘ hello    ’

--分别处理得到下列字符串ello、Hello、ll、hello。

select trim(leading 'h' from 'hello'),trim(' hello '),trim('b'from 'bllb'),

trim(' hello  ')from dual;

--4. 将员工工资按如下格式显示:123,234.00 RMB

select salary,trim(to_char(salary,'L99,999.00')) from employees;

--5. 查询员工的last_name及其经理(manager_id),要求对于没有经理的显示

--“No Manager”字符串。

select last_name,nvl(manager_id||'','no manager')from employees;

--6. 将员工的参加工作日期按如下格式显示:月份/年份。

select hire_date,to_char(hire_date,'mm/yyyy')from employees;

--7. 在employees表中查询出员工的工资,并计算应交税款:如果工资小于1000,税率为0,

--如果工资大于等于1000并小于2000,税率为10%,如果工资大于等于2000并小于3000,

--税率为15%,如果工资大于等于3000,税率为20%。

select last_name,salary,(case trunc(salary/1000)

   when 0 then salary*0

      when 1 then salary*0.1

        when 2 then salary*0.15

     else  salary*0.2 end)

       as"tex"from employees;

-- 等价连接的语法结构和示例

select employees.last_name, employees.job_id,

employees.department_id, departments.department_name

from   employees, departments

where  employees.department_id = departments.department_id

--2. 等价连接表别名示例

select e.last_name, e.job_id, e.department_id, d.department_name

from employees e, departments d

where  e.department_id = d.department_id

and  job_id LIKE '%MAN%';

 

--3. 查找特定城市员工信息

select  e.last_name, e.job_id, e.department_id, d.department_name,l.city

from   employees e, departments d, locations l

where   e.department_id = d.department_id

and   d.location_id = l.location_id

and   l.city IN ('Southlake','Oxford');

 

--4. 所有部门信息,不管部门是否有员工

select  e.last_name, e.job_id, e.department_id, d.department_name

fromemployees e, departments d

where  e.department_id(+) = d.department_id;

 

--5. 所有员工信息,不管员工是否有部门

selecte.last_name, e.job_id, e.department_id, d.department_name

from employees e, departments d

where  e.department_id= d.department_id(+);

 

--1. 查询员工的编号,姓名,以及部门名称(分别使用Oracle语法,自然连接,using子句,on子句)

select employee_id,last_name,department_name

from employees e,departments d where e.department_id=d.department_id;

 

select employee_id,last_name,department_name

from employees e natural join departments d;

 

select employee_id,last_name,department_name from employees e join departments d

on e.department_id=d.department_id;

--2. 查询部门名称为Shipping的员工的编号、姓名及所从事的工作。

select employee_id,last_name,department_name from employees e

join departments d on e.department_id=d.department_id

where d.department_name='Shipping'

--3. 查询所有工资大于等于6000元的员工姓名及其直接领导人的姓名、工资。要求查询结果中在

--员工和直接领导人之间加入字符串“works for

select e1.last_name||'works for'||e2.last_name,e2.salary from employees e1

join employees e2 on e1.manager_id=e2.employee_id

where e1.salary>=6000;

--4. 查询员工的编号,姓名,以及部门名称,包括没有员工的部门。

select employee_id,last_name,department_name from employees e

right join departments d on e.department_id=d.department_id;

--5. 查询员工的编号,姓名,以及部门名称,包括不属于任何部门的员工。

select employee_id,last_name,department_name from employees e

left join departments d on e.department_id=d.department_id;

--6. 显示比员工‘Abel’参加工作时间晚的员工姓名,工资,参加工作时间。

select *from employees where hire_date>

(select hire_date from employees where last_name='Abel');

--1. 员工最低工资及最高工资的示例。

select min(salary), max(salary) from employees;

--2. 员工姓最开始及最后的示例。

select min(last_name),max(last_name) from employees;

--3. 员工最早入职及最晚入职的示例。

select min(hire_date),max(hire_date) from employees;

--4. 公司员工总工资及平均工资的示例。

select sum(salary), round(avg(salary)) from employees;

--5. 公司IT_PROG职位的员工人数的示例。

select count(*)

from employees

where job_id='IT_PROG';

 

--6. 公司有部门员工人数的示例。

select count(department_id)

from employees;

 

--7. 公司有员工部门数的示例

select count( distinct department_id)

from employees;

--8. 员工平均奖金的示例——忽略空值。

select avg(commission_pct)

fromemployees;

 

--9. 员工平均奖金的示例——空值转化。

select avg(nvl(commission_pct,0)) from employees;

--10. 每个部门的总工资。

select department_id,sum(salary) from employees

group by department_id;

--11. 相同职位且经理相同的员工平均工资。

select job_id,manager_id,avg(salary)from employees

group by manager_id,job_id  order by job_id ;

--12. 公司每个职位的平价工资,职位列不显示,同时结果按照平均工资排序。

SELECT AVG(salary)

FROM employees

GROUP BY job_id

ORDER BY AVG(salary);

--1. 查询各部门平均工资在8000元以上的部门名称及平均工资。

select avg(salary),department_name from employees e join departments d

on e.department_id=d.department_id

group by department_name

having  avg(salary)>'8000';

--2. 查询工作编号中不含有“SA_”字符串及平均工资在8000元以上的工作编号及平均工资,并按平均工资降序排序。

select avg(salary),department_name from employees e join departments d

on e.department_id=d.department_id

where job_id not like '%AS_%'

group by department_name

having  avg(salary)>'8000';

--3. 查询部门人数在4人以上的部门的部门名称及最低工资和最高工资。

select max(salary),min(salary),department_name ,count(employee_id) from employees e join departments d

on e.department_id=d.department_id

GROUP BY department_name

having  count(employee_id)>'4';

 

--4. 查询工作不为AD_PRES,工资的和大于等于25000的工作编号和每种工作工资的和。

select  sum(salary),job_id from employees

where job_id <> 'AD_PRES%'

group by job_id

having  sum(salary)>='25000';

--5. 显示经理号码,这个经理所管理员工的最低工资,不包括经理号为空的,不包括最低工资小于3000的,按最低工资由高到低排序。

--1. 员工最低工资及最高工资的示例。

select min(salary), max(salary) from employees;

--2. 员工姓最开始及最后的示例。

select min(last_name),max(last_name) from employees;

--3. 员工最早入职及最晚入职的示例

select min(hire_date),max(hire_date) from employees;

--4. 公司员工总工资及平均工资的示例。

select sum(salary), round(avg(salary)) from employees;

--5. 公司IT_PROG职位的员工人数的示例。

select count(*)

from employees

where job_id='IT_PROG';

 

--6. 公司有部门员工人数的示例。

select count(department_id)

from employees;

 

--7. 公司有员工部门数的示例

select count( distinct department_id)

from employees;

--8. 员工平均奖金的示例——忽略空值。

select avg(commission_pct)

fromemployees;

 

--9. 员工平均奖金的示例——空值转化。

select avg(nvl(commission_pct,0)) from employees;

--10. 每个部门的总工资。

select department_id,sum(salary) from employees

group by department_id;

--11. 相同职位且经理相同的员工平均工资。

select job_id,manager_id,avg(salary)from employees

group by manager_id,job_id  order by job_id ;

--12. 公司每个职位的平价工资,职位列不显示,同时结果按照平均工资排序。

SELECT AVG(salary)

FROM employees

GROUP BY job_id

ORDER BY AVG(salary);

--1. 查询各部门平均工资在8000元以上的部门名称及平均工资。

select avg(salary),department_name from employees e join departments d

on e.department_id=d.department_id

group by department_name

having  avg(salary)>'8000';

--2. 查询工作编号中不含有“SA_”字符串及平均工资在8000元以上的工作编号及平均工资,并按平均工资降序排序。

select avg(salary),department_name from employees e join departments d

on e.department_id=d.department_id

where job_id not like '%AS_%'

group by department_name

having  avg(salary)>'8000';

--3. 查询部门人数在4人以上的部门的部门名称及最低工资和最高工资。

select max(salary),min(salary),department_name ,count(employee_id) from employees e join departments d

on e.department_id=d.department_id

GROUP BY department_name

having  count(employee_id)>'4';

 

--4. 查询工作不为AD_PRES,工资的和大于等于25000的工作编号和每种工作工资的和。

select  sum(salary),job_id from employees

where job_id <> 'AD_PRES%'

group by job_id

having  sum(salary)>='25000';

--5. 显示经理号码,这个经理所管理员工的最低工资,不包括经理号为空的,不包括最低工资小于3000的,按最低工资由高到低排序。

--1. 将一个新成立部门的信息写入departments表

 

insert from departments

values(200,'Operations',110,1500);

select * from departments;

 

--2. 将一个新成立部门的信息写入departments中 ,其中管理者未知

insert from departments

values(310,'Operations',null,1500);

select * from departments;

 

--3. 将一新入职员工信息写入employees表

insert into employees(employee_id,last_name,email,hire_date,job_id)

values(220,'wu','SWANG','10-9月-06','IT_PROG');

select * from employees;

 

INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)

VALUES(210,'Wang','SWANG','10-9月-06','IT_PROG');

select * from employees;

 

--4. 将受雇日期在“1995-1-1”之前的员工信息复制到hemployees表中

create table hemployees as

select * from employees where 1<>1;

insert from hemployees

select * from employees

where hire_date<TO_DATE('1995-1-1','YYYY-MM-DD');

select * from hemployees;

--5. 删除管理者编号(manager_id)为205的部门,相应部门的员工予以解聘,不包括205号员工

delete from employees

where department_id

in (select department_id from departments where manager_id =205)

and employee_id<>205;

select * from employees;

select * from departments;

 

--6. SQL*Plus自动提交的应用示例

SHOW AUTOCOMMIT;     

autocommit OFF

SET AUTOCOMMIT ON;  

INSERT INTO test VALUES ('TEST');

--1. 创建表date_test,包含列d,类型为date型。试向date_test表中插入两条记录,

--一条当前系统日期记录,一条记录为“1998-08-18”。

create table date_text(d date);

insert into date_text values(sysdate);

insert into date_text values(to_date('1998-08-18','yyyy-mm-dd'));

--2. 创建与departments表相同表结构的表dtest,将departments表中部门编号在

--200之前的信息插入该表。

create table dtest as

select * from departments where department_id<200;

--3. 创建与employees表结果相同的表empl,并将其部门编号为前50号的部门的信

--息复制到empl表。

create table empl as

select * from employees where department_id<50;

--4. 试创建student表,要包含以下信息:

--学生编号(sno):字符型(定table长)4位 主键

--学生姓名(sname):字符型(变长)8位  唯一

--学生年龄(sage):数值型  非空

create table student

(sno char(4) primary key,sname varchar2(8) unique,

sage number(2) not null);

 

--5. 试创建sc表(成绩表),要包含以下信息:

--学生编号(sno):字符型(定长)4位 主键 外键

--课程编号(cno):字符型(变长)8位  主键

--选课成绩(grade):数值型

create table sc

(sno char(4) ,

cno varchar2(8) ,

grade number(4),

constraint sc_sno_cno_pk primary key(sno,cno),

constraint sc_sno_pk foreign key(sno)

REFERENCES student(sno);

);

--6. 试为student增加一列学生性别 默认值 “女”。

alter table student add (sex char(2) default'女')

--7. 试修改学生姓名列数据类型为定长字符型10位。

alter table student modify(sname char(10));

--8. 试修改学生年龄列允许为空。

alter table student modify(sage number null);

--9. 试为选课成绩列添加校验(check)约束为1-100;

alter table sc add constraint sc_grade_ck check(grade>1 and grade<100);

--10. 试删除sc表中的外键约束。

alter table sc drop constraint sc_sno_fk;

--1. 创建表DOSSIER。

 

update dossier set country_code =default where id=2;

 

--2. 使用子查询创建表

CREATE TABLE dept10

AS

SELECT employee_id, last_name, salary+1000 newSalary

FROM employees  

WHERE department_id = 10;

 

--3. 引用另一个用户的表

SELECT *

FROM scott.emp;

 

--4. 查询数据字典

SELECT table_name

FROM  user_tables;

 

--5. 添加列、修改列、删除列

ALTER TABLE dossier MODIFY  (sex CHAR(2));

 

ALTER TABLE dossier ADD  (sex CHAR(1));

 

ALTER TABLE dept10 DROP (last_name,newsalary);

 

--6. 删除表

DROP TABLE emp;

 

--7. 重命名

RENAME emp TO empl;

 

--8. 增加约束

ALTER TABLE table ADD [CONSTRAINT constraint] type (column);  

 

 

--9. 删除约束

Alter table dossier drop constraint dossier_countrycode_fk;

 

--10. 约束的启用和禁用

ALTER TABLE table ENABLE CONSTRAINT constraint;

--1. 查询50部门的员工的年薪的视图

create or replace view salvu50 as

select employee_id,Id_NUMBER,last_name nume,

salary*12ann_salary from employees where department_id=50;

--2. 创建一个测试用表EMP_DML

create table emp_dml as select employee_id last_name,salary from

employees where department_id=50;

-- 创建视图v_emp1,是个简单视图。

create or replace view v_emp1 as

select employee_id,salary from emp_dml;

-- 通过视图进行DML操作。

update v_emp1 set salary=salary+100;

-- WITH CHECK OPTION例子

create or replace view v_emp3

as select employee_id,salary from emp_dml where employee_id=141

with check option constraint v_emp3_ck;

-- 删除视图

drop view employees;

-- 内联视图的例子

select last_name,department_name from departments a,

(select last_name,department_id from employees)b where a.department_id

_id=b.department_id;

-- 创建序列

create sequence student_seq start with 10000

increment by 1;

-- 修改序列

alter sequence test_seq

increment by 4

maxvalue 1000

nocache;

--. 创建索引

cteate index emp_last_name_idx

on employees(last_name);

index created.

--. 创建同义词

CREATE SYNONYM  s_emp

FOR  hr.employees;

 

 

--试创建视图v_emp_80,包含80号部门的员工编号,姓名,年薪列。

create or replace view v_emp_80 as

select employee_id,salary,last_name,salary*12 ann_salary from

 employees where department_id=80;

--从视图v_emp_80中查询年薪在12万元以上的员工的信息。

--创建试图v_dml,包含部门编号大于100号的部门的信息。

--从视图v_dml插入如下记录:部门编号360,部门名称AAA,管理者编号101,区域编号1700

--1. 从部门表中找到最大的部门号,将其输出到屏幕

declare

   num departments.department_id%type;

begin

   select max(department_id) into num from departments;

   dbms_output.put_line(to_char(num));  

end;

 

--2. 在部门表中插入一个新部门

begin

  insert into departments

  values(380,'computer','','');

  end;

  select * from departments;

--3. 将练习2中的部门从部门表中删除

 begin  

   delete from departments where department_id=380;

   end;                                  

 select * from departments;   

--4. 定义变量代表员工表中的员工号,根据员工号获得员工工资,

--如果工资小于4000,输出到屏幕上的内容为员工姓名和增涨10%以后的工资,

--否则输出到屏幕上的内容为员工姓名和增涨5%以后的工资

declare

  v_emp_id employees.employee_id%type:=100;

  v_emp_name employees.last_name%type;

  v_bonus employees.salary%type;

  v_sal employees.salary%type;

begin

  select salary , last_name into v_sal,v_emp_name from employees where employee_id = v_emp_id;

  

 v_bonus :=

 case

         

        when v_sal<4000 then v_sal*(1+0.1)

         

        else v_sal*(1+0.05)

          

     end;

     dbms_output.put_line(v_emp_name ||'   ' || v_sal);

 end;

 --1. PL/SQL示例

CREATE OR REPLACE PROCEDURE get_bonus

( p_empno in number) IS

v_bonus number(9,2);    --奖金数目

BEGIN

/*  根据员工的工资计算奖金并把结果插入到测试表中*/

SELECT sal into v_sal FROM emp WHERE empno=p_empno ;

v_bonus:=case

       when v_sal<1000 then 0.2* v_sal

       when v_sal between 1000 and 2000 then 0.4* v_sal

       else 0.5* v_sal

      end ;

   INSERT INTO testpl1(empno,sal,bonus)  values(p_empno,v_sal,v_bonus);

     COMMIT;

END get_bonus;

 

--2. 声明变量和常量

v_nation     CHAR(1);

 v_count     BINARY_INTEGER := 0;

 v_sal                  NUMBER(9,2) := 0;

 v_hire_date         DATE := SYSDATE ;

 v_flag                  BOOLEAN NOT NULL := TRUE;

 c_PI                  CONSTANT   NUMBER(6,5) := 3.14159;

 

--3. 声明一个PL/SQL TABLE

TYPE name_table_type IS TABLE OF VARCHAR2(16) INDEX BY BINARY_INTEGER;

v1_namename_table_type;

v2_namename_table_type;

 

--4. 声明一个PL/SQL RECORDS

TYPE emp_record_type IS RECORD

    (last_nameVARCHAR2(25),

     first_nameVARCHAR2(25),

     salNUMBER(8));

  emp_recordemp_record_type;

 

--5. 在3个数中找出最大值

declare

  a number:=10;

   b number:=20;

    c number:=15;

    imax a%type:=a;

begin

  if imax<b then imax:=b;end if;

  if imax<c then imax:=c;end if;

  dbms_output.put_line(imax);

end;

 

--6. 根据工资计算税并返回

IF v_sal > =3000 THEN

      RETURN (0.2 * v_sal );

   ELSIF v_sal >= 2000 THEN              

      RETURN (0.1 * v_sal);

   ELSE

      RETURN 0;

   END IF;

 

--7. 根据x值计算y值

     X:=1; LOOP      X:=X+1;      IF X>10 THEN          EXIT;     END IF;    END LOOP;  Y:=X;

 

--8. PL/SQL中SELECT语句的使用

SELECT last_name, salary

INTO v_LastName, v_Salary

    FROM employees

     WHERE employee_id = 113;

 

--9. 取出员工号为113的员工的姓名和工资

DECLARE

v_LastName employees.last_name%TYPE;

v_Salary employees.salary%TYPE;

BEGIN

SELECT last_name, salary

INTO v_LastName, v_Salary

    FROM employees

     WHERE employee_id = 113;

DBMS_OUTPUT.PUT_LINE(

v_LastName || ’的工资是’ ||  to_char(v_salary ));

END;

 1. 在屏幕上输出工资最高的前5名员工姓名,参加工作时间,工资

 

declare

cursor cur_emp is

select last_name,hire_date,salary from employees order by salary desc;

v_last_name employees.last_name%type;

v_hire_date employees .hire_date%type;

v_salary employees.salary%type;

begin

  open cur_emp;

  loop

    fetch cur_emp into v_last_name,v_hire_date,v_salary;

    exit when cur_emp%notfound or cur_emp%rowcount>5;

    dbms_output.put_line(v_last_name||'--'||v_salary);

  end loop;

  close cur_emp;

end;  

 

2. 把参加工作时间在1995年之后的员工姓名(first_name,last_name,参加工作时间显示在屏幕上

 

 

declare

cursor cur_emp is

select first_name,last_name,hire_date from employees where hire_date>'1-1月-1995';

rec_emp cur_emp%rowtype;

 

begin

  open cur_emp;

  loop

    fetch cur_emp into rec_emp;

    exit when cur_emp%notfound ;

    dbms_output.put_line(rec_emp.last_name);

  end loop;

  close cur_emp;

end;  

 

 

 

3. 创建一个新表dept_test,包含字段部门号,部门名称,利用游标遍历部门表,把部门表中的部门号,部门名取出插入到表dept_test

 

 create table dept_test

  (

         dept_id number primary key,

         dept_name varchar(20)

  )

  

  declare

     cursor cur_dept is select department_id,department_name from departments;

  begin

    for v_dept in cur_dept loop

        insert into dept_test(dept_id,dept_name)

        values(v_dept.department_id,v_dept.department_name);

      end loop;

    end;

    

    

--4. 工资大于5000的员工姓名(last_name)"A""K"之间的合成一个字符串,"L""M"之间合成一个字符串,"N""Z"之间合成一个字符串,分别在屏幕上输出

 

    declare

    cursor cur_emp is

    select last_name from employees where salary>5000;

    v_last_name employees.last_name%type;

    v_string1 varchar2(500);

    v_string2 varchar2(500);

    v_string3 varchar2(500);

begin

    for v_emp in cur_emp loop

      v_last_name:=substr(v_emp.last_name,1,1);

        if v_last_name>='A' AND v_last_name<='K' then

          v_string1:=v_string1||v_emp.last_name||',';

        elsif v_last_name>='L' and v_last_name<='M' then

            v_string2:=v_string2||v_emp.last_name||',';

        else v_string3:=v_string3||v_emp.last_name||',';

        end if;      

    end loop;

      dbms_output.put_line(v_string1||'-----------');

       dbms_output.put_line(v_string2||'-----------');

        dbms_output.put_line(v_string3);

  end;

  

  

  --1. 声明游标,取得满足某一工资标准的员工信息

declare

.....

cursor curEmpIS select ename,salary

from emp

where salary>2000;

....

begin

   end;        

   

--2. 打开游标

open cursor_name;

--3. 从游标读取数据

fetch curemp

into v_name,v_sal;

--4. 关闭游标

close cursor_name;

--5. 带参数的游标

cursor emp_cur

(v_dept numbeb,v_job varchar2)is

select last_name,salary,hire_date

from employees

where department_id=v_dept

and job_id=v_job;

--1. 根据员工号,获得员工到目前为止参加工作年限(保留到整数),员工号不存在时提示“此员工号不存在”

   

declare

  v_year number;

begin

  select round(months_between(sysdate,hire_date)/12) as hire_year

  into v_year from employees

  where employee_id=1000;

exception

   when no_data_found then

     dbms_output.put_line('找不到数据');

    end;

 

--2. 编写PL/SQL块,使用SELECT语句将when no_date_found then

     dbms_output.put_line('找不到数据');的员工的姓名及工作编号显示出来,如果符合条件的员

--工多于一人,则返回字符串“最高管理者人员过多!”字符串,如果找到没有符合条件的记录,则返回字符串

--“没有最高管理者,请指定”

declare

   emp_id employees.employee_id%type;

   emp_name employees.last_name%type;

     

begin

    select employee_id,last_name into emp_id,emp_name

    from employees

    where manager_id is null;

    dbms_output.put_line(emp_id||'--'||emp_name);

    exception

 when no_data_found then

     dbms_output.put_line('没有管理者');

 

 when too_many_rows then

     dbms_output.put_line('最高管理者人员过多');

  end;

 

 

 

--3. 获得每个部门的平均工资,如果平均工资大于15000,视为用户定义的异常,提示“该部门的平均工资过高”

 

declare

 

    cursor v_cur is select department_id,round(avg(salary)) as salary_avg from employees

    group by department_id;

    too_hight exception;

    

begin

  

    for v_emp in v_cur loop

      dbms_output.put_line(v_emp.department_id||'--'||v_emp.salary_avg);

      if v_emp.salary_avg>15000 then

        raise too_hight;

        end if;

        end loop;

        exception

          when too_hight then

          dbms_output.put_line('该部门的平均工资过高');  

        

  end;

 

 

--1.创建测试表

Create table t_test

(f_1 varchar2 (20),f_2 number(3,0));

--2.创建过程

CREATE OR REPLACE PROCEDURE

 up_ins_test

(p_f1 varchar2 ,p_f2 number default 10)

IS

BEGIN

?????? INSERT INTO t_test (f_1,f_2) VALUES(p_f1,p_f2);

END up_ins_test;

--3.在过程中调用过程

CREATE OR REPLACE PROCEDURE process_ins

    (p_f1 varchar2 , p_f2 number)

IS

BEGIN

     change_salary (p_f1, p_f2);

     ...

END;

--4.使用名称

SQL> exec up_ins_test (p_f2=> 100,p_f1=> ‘abc’);

--5.使用位置

SQL> exec up_ins_test (‘abc’, 100);

--6.使用混合方式

SQL> exec up_ins_test (‘abc’, p_f2=> 100);

--7.使用employees表,编写搜索过程,输入EMPLOYEE_ID,返回LAST_NAME

CREATE OR REPLACE PROCEDURE up_GetEmpName

(p_empid in employees.employee_id%type,

?????? p_ename out employees.last_name%type)

AS

BEGIN

   SELECT last_nam  INTO p_ename

    FROM employees  WHERE employee_id = p_empid;

EXCEPTION

WHEN NO_DATA_FOUND THEN

??????????? p_ename := ‘null’;

?END up_GetEmpName;

--8.和其他数据库对象一样,删除存储过程时使用DROP语句,语法如下:

SQL> DROP PROCEDURE procedure_name;

--9.删除过程up_GetEmpName

SQL> DROP PROCEDURE up_GetEmpName;

--10.创建存储过程PrintEmp,将EMPLOYEES表中所有员工的编号和姓名显示出来。

create or replace pracedure printEmp

is

cursor cur_emp is

 

select employee_id,last_name from employees;

begin

  for v_empin cur_emp loop

    dbms_outer.put_line(v_emp.last_name);

    end loop;

    end;

--11.创建存储过程PTEST,接受两个数相除并且显示结果,如果第二个数是0,则显示消息“not to DIVIDE BYZERO!”,不为0则显示结果。

create or replace procedure

ptest(v_1 number,v_2 number)

is

begin

  dbms_outer.put_line('两个数相除在结果:'+v_1/v_2))

 exception

   when others then

     dbms_output.put_line('出书不呢变更为0')

     end

     begin

       ptest(1,2);

       end;

--12.创建一个函数Emp_Avg:根据员工号,返回员工所在部门的平均工资。

create or replace function

getAvg(emp_id employees.employee_id%type)

return employees.salary%type;

is

begin

  select avg(salary)into | from employees

  department_id=

  (select department_id from employees where employee_id)

  return avg_salary

  end;

--13.创建一个过程Update_SAL,通过调用上题3中的函数,实现对每个员工工资的修改:如果该员工所在部门的平均工资小于1000,则该员工工资增加500;大于等于1000而小于5000,增加300;大于等于5000,增加100

is

cursor cur_emp is

select employee_id from employees;

v_salary employees.salary%type;

begin

  for v_emp in cur_emp loop

    v_salary:=getAvg(v_emp.employee_id);

    if v_salary<1000 then

      update employees set salart+500

      where employees_id=v_emp.employee_id;

      end if;

--14.创建存储过程,根据员工编号计算该员工年薪(工资+奖金),并将计算出的年薪值传递到调用环境。

create or replace

procedure getYearSal(emp_id number,year_sal out number);

is

begin

  select(salary+nvl(commision_pct,0))*12 into year_sal;

  from employees

  where employee_id=emp_id;

  end;

  declare year_sal number;

  begin

    getYearSal(100,year_sal);

    dbms_output.put_line(year_sal);

    end;

 

 

 

 

 


以上是关于oracle习题的主要内容,如果未能解决你的问题,请参考以下文章

oracle习题

Oracle数据库面试练习题

几个oracle练习题

oracle强化练习题

Oracle 练习题

oracle习题集-高级查询2