用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - sql代码库

第十四章 函数

2014-04-26 作者: Rainlate举报

[sql]代码库

第十四章 函数
in 只读
out 只写
in out 可读写
 函数就是一个有返回值的过程。
定义一个函数:此函数可以根据雇员的编号查询出雇员的年薪
CREATE OR REPLACE FUNCTION myfun(eno emp.empno%TYPE) 
RETURN NUMBER 
AS
 rsal NUMBER ;
BEGIN
 SELECT (sal+nvl(comm,0))*12 INTO rsal FROM emp WHERE empno=eno ;
RETURN rsal ;
END ;
/
直接写 SQL 语句,调用此函数:
SELECT myfun(7369) FROM dual ;
v_dfd := EXEC myfun(7369);

练习
1: 使用游标 和 loop 循环来显示所有部门的名称
2: 使用游标 和 loop 循环来显示所有部门的的地理位置(用%found 属性)
3:接收用户输入的部门编号,用 for 循环和游标,打印出此部门的所有雇员的所有信息
4:向游标传递一个工种,显示此工种的所有雇员的所有信息
5:用更新游标来为雇员加佣金:
6:编写一个 PL/SQL 程序块,对名字以‘A’或‘S’开始的所有雇员按他们的基本薪水的
10%给他们加薪
7:编写一个 PL/SQL 程序块,对所有的 salesman 增加佣金 500
8:编写一个 PL/SQL 程序块,以提升 2 个资格最老的职员为高级职员(工作时间越长,资格越老)
9:编写一个 PL/SQL 程序块,对所有雇员按他们的基本薪水的 20%为他们加薪,如果增加
的薪水大于 300 就取消加薪
 
写一个函数 输入一个员工名字,判断该名字在员工表中是否存在。存在返回 1,不存在返回 0
create or replace function empfun(en emp.ename%type) return number as is_exist number; begin
select count(*) into is_exist from emp where ename=upper(en); return is_exist; end;
/
 
1.写一个函数,传入员工编号,返回所在部门名称
create or replace function myfun(eno emp.empno%type) return varchar as
 name varchar(30); begin
 select d.dname into name  from emp e,dept d where e.deptno = d.deptno and e.empno = eno;  return name; end;
/
 
2.写一个函数,传入时间,返回入职时间比这个时间早的所有员工的平均工资
 
create or replace function getAvgSal(hdate emp.hiredate%type) return number as  esal number; 
begin
 select avg(sal) into esal from emp where hdate>emp.hiredate;  return esal; end;
/
删除一张表重复记录(ID 是自增唯一,重复记录:其他字段都是一样)
非常经典的一道面试题(可能存在很多数据,要求性能比较高) aa
1  louis 20
2  louis 20
3  jimmy 30
4  louis 20
------------------------------------------------------------------
delete from aa where id not in(select min(id) from aa group by name,age);
------------------------------------------------------------------- 
delete test where id in  (select distinct t2.id    from test t1,test t2
  where t1.id<t2.id and t1.name=t2.name and t1.age=t2.age); 
-------------------------------------------------------------------------
 delete test where id in  (select distinct t1.id    from test t1,test t2
  where t1.id<t2.id and t1.name=t2.name and t1.age=t2.age);
--------------------------------------------- create table tmp as select distinct name ,age from aa; truncate table aa; insert into aa select * from tmp; drop table tmp;
----------------------------------------------- create table tmp as select * from aa where 1=2;
DECLARE
 CURSOR mycur IS select * from aa order by id;
 
a1 aa%rowtype; cou number; begin
 for a1 in mycur loop
  
  select count(*) into cou from tmp     where name=a1.name and age=a1.age; if cou=0 then 
  insert into tmp values(a1.id,a1.name,a1.age);
  else
   delete from aa where id = a1.id;
  end if;  end loop; end;
--------------------------------------------------------------
DECLARE
 CURSOR mycur IS select * from aa order by id;
 
a1 aa%rowtype; cou number; begin
 for a1 in mycur loop
  
  select count(*) into cou from tmp     where name=a1.name and age=a1.age;
  
  if cou=0 then     insert into tmp values(a1.id,a1.name,a1.age);   end if;  end loop;
 
 delete from aa;
 insert into aa select * from tmp; end;


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...