oracle 触发器入门,Oracle入门基础(十二)一一储存过程及触发器

本文详细介绍了Oracle数据库中的存储过程,包括无参、带参、返回函数及使用光标的存储过程,并展示了如何创建和调用这些过程。此外,还讲解了触发器的应用,如新员工插入后的自动通知,以及复杂的非工作时间插入限制和薪资更新检查。
摘要由CSDN通过智能技术生成

1.第一个存储过程

打印Hello World

调用存储过程:

1.exec sayhelloworld();

2.begin

sayhelloworld();

sayhelloworld();

end;

create or replace procedure sayhelloworld

as

--说明部分

begin

dbms_output.put_line('Hello World');

end;

2.带参数的存储过程

给指定的员工涨100,并且打印涨前和涨后的薪水

create or replace procedure raiseSalary(eno in number)

is

--定义变量保存涨前的薪水

psal emp.sal%type;

begin

--得到涨前的薪水

select sal into psal from emp where empno=eno;

--涨100

update emp set sal=sal+100 where empno=eno;

--要不要commit?

dbms_output.put_line('涨前:'||psal||' 涨后:'||(psal+100));

end raiseSalary;

3.存储函数

查询某个员工的年收入

create or replace function queryEmpIncome(eno in number)

return number

is

--定义变量保存月薪和奖金

psal emp.sal%type;

pcomm emp.comm%type;

begin

--得到月薪和奖金

select sal,comm into psal,pcomm from emp where empno=eno;

--返回年收入

return psal*12+nvl(pcomm,0);

end queryEmpIncome;

4.out参数

–查询某个员工的姓名 薪水和职位

/*

1、查询某个员工的所有信息 —> out参数太多

2、查询某个部门中的所有员工信息 ----> 返回的是集合

*/

create or replace procedure queryEmpInformation(eno in number,

pename out varchar2,

psal out number,

pjob out varchar2)

is

begin

select ename,sal,job into pename,psal,pjob from emp where empno=eno;

end queryEmpInformation;

5.在out参数中使用光标

查询某个部门中的所有员工信息 ----> 返回的是集合

create or replace package mypackage is

type empcursor is ref cursor;

procedure queryEmpList(dno in number,empList out empcursor);

end mypackage;

create or replace package body mypackage is

procedure queryEmpList(dno in number,empList out empcursor)

as

begin

open empList for select * from emp where deptno=dno;

end;

end mypackage;

6.第一个触发器

每当成功插入新员工后,自动打印“成功插入新员工”

create trigger firsttrigger

after insert

on emp

declare

begin

dbms_output.put_line('成功插入新员工');

end;

触发器应用一

实施复杂的安全性检查

禁止在非工作时间 插入新员工

1、周末: to_char(sysdate,‘day’) in (‘星期六’,‘星期日’)

2、上班前 下班后:to_number(to_char(sysdate,‘hh24’)) not between 9 and 17

create or replace trigger securityemp

before insert

on emp

begin

if to_char(sysdate,'day') in ('星期六','星期日','星期五') or

to_number(to_char(sysdate,'hh24')) not between 9 and 17 then

--禁止insert

raise_application_error(-20001,'禁止在非工作时间插入新员工');

end if;

end securityemp;

触发器应用二

/*

数据的确认

涨后的薪水不能少于涨前的薪水

create or replace trigger checksalary

before update

on emp

for each row

begin

--if 涨后的薪水 < 涨前的薪水 then

if :new.sal < :old.sal then

raise_application_error(-20002,'涨后的薪水不能少于涨前的薪水。涨前:'||:old.sal||' 涨后:'||:new.sal);

end if;

end checksalary;

标签:触发器,end,入门,sal,create,number,psal,emp,Oracle

来源: https://blog.csdn.net/Aaron_112/article/details/100992862

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值