Oracle练习题(九)

Oracle练习题(九)

(1) 创建一个存储过程,以员工号为参数,输出该员工的工资

--创建存储过程

create or replace procedure print_sal(n number) as

  val_sal emp.sal%type;

begin 

  select emp.sal into val_sal from emp where empno = n;

  dbms_output.put_line(n||'号员工的工资为:'||val_sal);

end;

--执行

exec print_sal(7499);

Oracle练习题(九)_第1张图片

(2) 创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,则工资增加150;若属于20号部门,则工资增加200;若属于30号部门,则工资增加250;若属于其他部门,则增加300。

--创建存储过程

create or replace procedure pro_update_sal(n number) as

  val_deptno emp.deptno%type;

begin  

  select deptno into val_deptno from emp where empno=n;

  case val_deptno

    when 10 then 

      update emp set sal=sal+150 where empno = n;

    when 20 then 

      update emp set sal=sal+200 where empno = n;

    when 30 then 

      update emp set sal=sal+250 where empno = n;

    else

      update emp set sal=sal+300 where empno = n;

  end case;

end;

--执行

 exec pro_update_sal(7499);

Oracle练习题(九)_第2张图片

(3) 创建一个程,以员工号为参数,返回该员工的工作年限(以参数形式返回)。

--创建存储过程

create or replace procedure pro_return_year(n number,yeartime out varchar2) as

begin

  select to_char(sysdate,'YYYY')-to_char(emp.hiredate,'YYYY') into yeartime from emp where empno = n;

end;

--声明变量,接受工作年限的值

var a varchar2;

--执行

exec pro_return_year(7499,:a);

Oracle练习题(九)_第3张图片

(4) 使用无参游标cursor,查询所有员工的姓名和工资

--创建游标。1创建游标2打开游标3存取游标4关闭游标

create or replace procedure pro_select_name_and_sal as

 cursor cur_emp is select ename,sal from emp;

 val_name emp.ename%type;

 val_sal emp.sal%type;

begin 

  open cur_emp;

  fetch cur_emp into val_name,val_sal;

  while cur_emp%found loop

    dbms_output.put_line('姓名:'||val_name||'工资:'||val_sal);

    fetch cur_emp into val_name,val_sal;

  end loop;

  close cur_emp;

end;

--执行

exec pro_select_name_and_sal;

Oracle练习题(九)_第4张图片

(5) 创建语句级触发器,当对emp表进行delete操作后,显示"world hello"

--创建触发器

create or replace trigger tri_delete after delete on emp 

begin

  dbms_output.put_line('world hello');

end; 



--删除时触发

delete from emp where deptno = 10; 

Oracle练习题(九)_第5张图片

(6) 周一到周五,且9-17点能向数据库插入数据,否则显示异常提示

--创建触发器

create or replace trigger tri_check before insert or delete or update on emp

begin

  if to_char(sysdate,'d') in ('1','7') then

    raise_application_error(-20000,'不能在非工作日更改员工信息,上班时间为周一到周五9-17点');

  elsif to_char(sysdate,'hh24:mi:ss') not  between '9:00:00' and '17:00:00' then

    raise_application_error(-20000,'不能在非上班时间更改员工信息,上班时间为周一到周五9-17点');

  end if;

end;



--删除时触发

delete from emp where deptno = 10; 

Oracle练习题(九)_第6张图片

(7) 创建行级触发器,涨后工资这一列,确保大于涨前工资

--创建行级触发器

create or replace trigger tri_test before update on emp for each row 

begin 

  if :old.sal>:new.sal then 

    raise_application_error(-20001,'更新失败,涨后工资小于涨前工资!');

  end if;

end;


--触发

update emp set sal = sal-100 where empno = 7499;

Oracle练习题(九)_第7张图片

你可能感兴趣的:(Oracle,oracle,数据库,database,sql,dba)