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_name和last_name,要求结果显示为“姓last_name名first_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习题的主要内容,如果未能解决你的问题,请参考以下文章