Oracle数据库(触发器、存储过程、函数、包)
作者:网络转载 发布时间:[ 2016/10/10 9:53:53 ] 推荐标签:数据库 Oracle
Sql代码
-- 限制员工的工资不能超过当前的高工资
create or replace trigger tr_emp_salary
-- update of 后面指定在那些列被改变时才调用这个触器,如果不加of 默认是所有列
before update of sal on emp
-- 指定该触发器为行级触发器
for each row
-- 如果要定义变量,则只能在Declare中定义
declare
maxSalary number(10,2);
begin
select max(sal) into maxSalary from emp;
if :new.sal > maxSalary then
raise_application_error(-20010,'员工工资超出工资上限!');
end if;
end;
/
Sql代码
-- 设置员工的工资不能低于原工资,但也不能高出原工资的20%
create or replace trigger tr_emp_say
before update of sal on emp
for each row
-- 设置执行触发器的条件
when (new.sal < old.sal or new.sal > old.sal*1.2)
begin
raise_application_error(-20011,'员工的工资不能降薪,但工资升幅不能超过20%!');
end;
/
对于上述触发器可以进行的一些操作:
Sql代码
-- 显示触发器
select trigger_name,status from user_triggers;
-- 禁止触发器
alter trigger tr_emp_salary disable;
-- 激活触发器
alter trigger tr_emp_salary enable;
-- 禁止表的所有触发器
alter table emp disable all triggers;
-- 激活表的所有触发器
alter table emp enable all triggers;
-- 重新编译触发器
--alter trigger tr_emp_salary compile;
-- 删除触发器
drop trigger tr_emp_salary;
知识点二、存储PL/SQL单元
存储PL/SQL单元是存储过程、函数、包,有名字,可以调用,会被存储到数据库服务器的PL/SQL代码,数据字典中;子程序可以接收参数;包子程序:属于某个包;独立子程序:不属于任何包;函数有返回值。
子程序参数有三种模式:
in:传入参数,只能用于传入值,不能修改,调用时必须传值,该模式是默认模式
out:传出参数,只能用于把值返回给调用者,不能用于接收值(接收不到值)
in out:以上两种的结合
知识点三、存储过程
创建过程时,系统会对其进行编译,并将执行代码存储到数据库中。有名字,可接收参数,没有返回值。
存储过程定义语法:
create [or replace] procedure 过程名 [(参数名 参数模式 参数类型,...)] is|as
[declaration] --定义部分
begin
--执行部分
[exception]
--异常处理部分
end [过程名];
创建时不执行,调用时才执行。
1.在SQL>提示符下调用过程,execute 过程名(参数 ...)
2.在PL/SQL块中调用过程,过程名(参数 …),可独立作为PL/SQL语句
可以在匿名块、其他的存储过程、函数中调用。
存储过程中可以直接执行DML语句(select、insert、update、delete),不能直接执行DDL语句。
存储过程中如需执行DDL语句,先把DDL语句存放在一个字符串变量中,然后通过execute immediate语句执行字符串内容,字符串内容必须符合SQL语法。用户从角色中获取的权限,在PL/SQL块中
存储过程中创建触发器实现主键自增长:
create or replace procedure pk_auto_increment_pro(t_name varchar2) is
v_ddl varchar2(2000);
begin
v_ddl := 'create or replace trigger pk_auto_increment_' || t_name ||
' before insert on ' || t_name ||
' for each row
begin
dbms_output.put_line(''赋值前id:'' ||:new.id);
select test_seq.nextval into :new.id from dual;
dbms_output.put_line(''赋值后id:'' ||:new.id);
end;';
execute immediate v_ddl;
end;
知识点四、函数
函数的编译号存放在数据库服务器的代码,必须有返回值。
创建函数:
create [or replace] function 函数名 [(参数列表)] return 返回值类型 is|as
[local declarations] --定义部分
begin
--执行部分
return 结果; 一定要有retutn,用于返回值
exception
--异常处理部分
end;
两种方式调用函数:
1.在SQL>提示符下调用函数
var varName 类型; --定义变量
call 函数名 into :varName;
print varName;
2.在SQL语句、PL/SQL块中调用函数,不能作为独立的PL/SQL语句,参照表达式用法
(表达式不是语句,可以作为其他语句的一部分)。
知识点五、包
包用于将相关的对象组合在一起,一个任务,需要多个函数或者过程协同才能完成,这时,可以这些函数和存储过程都放在一个包下,方便函数和存储过程的管理,提高程序的性能,在第一次用的时候,会全部读入内存,下次用直接从内存取,加强模块化。
包分为两部分:
1.包头(类似java接口)
包的规范,只包含了函数或存储过程的说明部分
创建包头语法:
create [or replace] package 包名 is|as
--函数定义
function 函数名 [(参数列表)] return 返回类型;
--存储过程定义
procedure 存储过程名 [(参数列表)];
end [包名];
2.包体(类似java实现类)
实现包头里定义的规范
创建包体语法:
create [or replace] package body 包名 is|as
--函数实现
function 函数名 [(参数列表)] return 返回类型 is|as
函数实现内容
--存储过程实现
procedure 存储过程名 [(参数列表)] is|as
存储过程实现内容
end [包名];
使用包子程序的时候,包名.子程序名。
调用存储过程时,如果不需要传参,调用该过程的时候,可以加(),也可以不加。
调用函数时,如果不需要传参,在SQL*Plus中运行,必须加(),其他不需要
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南