Oracle 自主学习笔记(五)

一、
存储过程语法结构

create or replace procedure 存储过程名
is|as
声明语句段;
begin
执行语句段;
exception
异常处理语句段;
end 存储过程名;


in 模式的形参只能只能将实参传给形参,进入存储过程内部,只能读不能写
out 模式在存储过程内部可以读写,返回时形参的值会返回给形参
in out 具有以上两种属性

例子:
create or replace procedure proc(i in int)
as
a varchar(20);
begin
for j in 1..i loop
a:=a'*';
dbms_output.put_line(a);
end loop;
end
/

执行:exec proc(5);

函数语法

create or replace function 函数名
return 数据类型
as|is
声明部分
begin
可执行部分
return(表达式)
exception
异常处理部分
END[函数名]


二、
触发器是响应插入、更新或删除等数据库事件而执行的过程
它定义了当一些数据库相关事件发生时应采取的动作。触发
器即用来监视数据库的各项操作。

DML触发器语法

create or replace trigger triggername

before/after
 
update/insert/delete...

on triggername

for each row

when 条件


create or replace trigger trigg1

before insert on emp

for each row

begin 

if :new.empno < 0 then        在插入之前,不让这个存储过程为NULL

  raise_application_error(-20001, '员工编号为负,不能插入到表中!');
 end if;
end;

 

declare
  empno integer;
  ename varchar2(20);
  hiredate date;
  comm number;
  t int;
  lc number;
  i integer;
begin
  select empno,ename,iredate,comm into empno,ename,hiredate,comm from emp where empno = &i;
  select mons_between(sysdate,hiredate) into t from emp where empno = &i;
  if t > 120 theni
    update emp set comm = comm + 10000 where empno = i;
  else if t > 60 and t <= 120 then
    update emp set comm = comm + 5000 where empno = i;
  end if;
  commit; 提交

  select comm into lc from emp where empno = i;
  dbms_output.put_line(empno||' 'ename||' '||hiredate||' '||comm||' '||lc);
end;

 
5、对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪水减50元

PL/SQL 语句
declare                             先declare声明

myempno emp.emp%type := '&no';
empeg   scott.emp%rowtype;
avgsal  number;
saleg   number;
depteg  scott.dept%rowtype;

begin
select * into empeg from scott.emp where emp.empno = myempno;
select * into depteg from scott.dept where dept.deptno = empeg.deptno;
select avg(sal) into avgsal from scott.emp group by emp.deptno having emp.deptno = empeg.deptno;
if empeg.sal > avgsal then
saleg := empeg.sal-50;
else saleg := empeg.sal;
end if;
update emp set emp.sal = saleg where emp.empno = myempno;

dbms_output.put_line('员工编号:' || myempno || '姓名:' || empeg.ename ||
'之前工资:' || empeg.sal || '现在工资:'|| saleg);

6、

创建一个存储过程,实现:通过输入员工编号查看员工姓名、工资、奖金:
1.1 如果输入的编号不存在,进行异常提示处理:
1.2 如果工资高于4000,进行异常提示处理:
1.3 如果奖金没有或为0,进行异常提示处理:

存储过程 procedure

create or replace procedure proemp(myempno in int) as

empeg scott.emp%rowtype;

ifexists number;

begin 
select * into empeg from scott.emp where emp.empno = myempno;
select count(1) into ifexists from scott.emp where emp.empno = myempno;

if ifexists = 0 then
dbms_output.put_line('您输入的编号不存在!');
elsif empeg.sal > 4000 then
dbms_output.put_line('该员工工资高于4000');
elsif nvl(empeg.comm,0) = 0 then
dbns_output.put_line('该员工没有奖金!');
else null;
end if;

dbms_output.put_line('员工编号:' || myempno ||'姓名' || empeg.ename || '工资:' || empeg.sal
|| '奖金:' || empeg.comm);

end proemp;   end  过程名


exec proemp;

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值