Oracle PL/SQL高级特性
定义:PL/SQL该语言只针对Oracle,是SQL过程语言的扩展,它将SQL数据库语言与一个过程程序设计语言结合在一起,此程序设计语言基于称为块的单元,一个块包含SQL和PL/SQL语句.
触发器:是指存放在数据库中,并被隐含执行的过程,体现了数据完整约束.Oracle不仅支持DML(操作语言)触发器,也允许基于系统事件和DDL(数据定义语言)操作建立触发器.
触发器简介:触发器由触发事件,触发条件和触发操作三部分组成.
触发事件:是指引触发器触发的SQL语句,数据库事件或用户事件,
触发条件(触发时机):根据逻辑处理而进行触发程序集的一系列的条件.
触发操作:是指包含SQL语句和其它执行代码的PL/SQL块,触发器大大小不能超过32k.
DML触发器:建立DML触发器时,需要指定触发器时机,触发事件,表明,触发类型,触发条件以及触发操作.
触发时机:用于指定触发器的触发时间(before表示执行DML操作之前触发,after表示执行DML操作之后触发).
触发事件:指定导致触发器执行的DML操作(INSERT ,UPDAET,DELETE).
表名:指定DML操作所对应的表.
触发类型:(行级别,语句级别和单元格级别)
DML触发器触发顺序:在单行执行DML操作时先执行表的Before语句触发器,再执行before行触发器.
语法:create or replace trigger t_name
{before/after} {insert or update or delete}
{of column} on {table or view}--单元格级别
{for each row}--行级别(row表中有old和row表)
{when }
begin
逻辑处理......
end;
例如: 创建表
create table emp_log
(
id number not null,
mydate date not null,
mark varchar2(30)
)
创建序列
create sequence seq_log
start with 1
nomaxvalue
increment by 1
创建触发器
create or replace trigger t_emp_log
after insert on scott.emp for each row
begin
insert into emp_log values(seq_log.nextval,sysdate,'这是插入操作' || :new.empno);
dbms_output.put_line(:new.empno);
end;
管理触发器:
显示触发器信息:select * from user_tigger where table _name='emp'
禁用触发器:alter trigger tr_check_sal disable;
激活触发器:alter trigger tr_check_sal enable;
禁用或激活表的所有触发器:alter table emp disable all trigers;
alter table emp enable all triggers;
重新编译触发器:alter trigger tr_check_sal compile;
删除触发器:drop trigger tr_check_sal(触发器名称)
程序包:用于逻辑组合相关的PL/SQL类型,可以简化应用设计,提高应用性能,还可以实现信息的隐蔽,子程序的重载功能.
内置程序包:扩展数据库的功能,为PL/SQL提供SQL功能的访问.一般具有sys权限的高级管理人员使用.
常用的程序包:
dbms_alter:用于支持数据库事件的异步通知.
dbms_standard:提供语言工具.
dbms_ddl:某些DDL命令的PL/SQL等效项.
calendar:提供日历维护功能.
dbms_lob:操作oralce的lob数据.
dbms_output:在SQL*PLUS或服务管理器中提供屏幕输出.
dbms_rowid:允许从rowid获得信息,相当与rowno分页.
dbms_session:alter session的PL/SQL等效项.
dbms_sql:动态PL/SQL和SQL.
dbms_output程序包允许显示PL/SQL块和子程序的输出结果.
put:用于将一个信息存储在缓冲区中.
put line:用于将一个信息存储在缓冲区中,后接一个换行结束标记.
new line:没有参数,它用于向缓冲区添加换行符,换行符充当行结束标记.
dbms_lob程序包包含处理大型对象的过程和函数.在oracle中lob分为以下几种类型.
blob:二进制大对象,clob:字符大对象和bfile外部存储的二进制文件.
常用的函数和过程:
getlength:此函数返回指定的blob,clob或bfile的长度.
instr:此函数从lob数据中查找字串.
read:此过程从lob数据中读取指定长度的数据到缓冲区.
substr:此函数从lob数据中取字串.
write:此过程用于将指定数量的数据写入lob.
建立包:包由包头和包体两部分组成,包头用于预定函数,存储过程,没有实现,包体用于具体实现.
定义包头:
例如:create or replace package pack_test
as
function delete_emp2 return number;--函数
procedure delete_emp(v_no number);--存储过程
end;
定义包体:
例如:create or replace package body pack_test
as
procedure delete_emp(v_no number)
as
begin
delete emp where empno = v_no;
end delete_emp;
function delete_emp2 return number
as
begin
return 1;
end delete_emp2;
end pack_test;
调用程序包:declare
begin
pack_test.delete_emp(2222);
end;