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);

(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);

(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);

(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;

(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; 

(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; 

(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;

 
                     
                    
                 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号