过程中的事务
定义过程p1
create or replace procedure p1
as
begin
insert into student values(5,'xdh','m',sysdate);
rollback;
end;
定义过程p2
create or replace procedure p2
as
begin
update student set stu_sex = 'a' where stu_id = 3;
p1;
end;
执行过程p2
exec p2;
执行完毕发现表中数据没有变更,说明p1中的rollback语句将p2中的update语句也回滚了。
自主事务处理
步骤:
主事务处理启动自主事务处理
主事务处理被暂停
自主事务处理sql操作
中止自主事务处理
恢复主事务处理
pragma autonomous_transaction
用于标记子程序
在p1的as begin当中加入 pragma autonomous_transaction 后执行,发行p2的update语句生效,p1中的事务作为自主事务来处理,不影响主事务。
程序包
相关对象的封装
-程序包规格说明
声明子程序,不包含实现
create package 包名 is|as 变量声明|类型定义|异常声明|游标声明|函数说明|过程说明
pragma restrict_references(函数名,WNDS[,WNPS][,RNDS][,RNPS])
end [包名];
create or replace package StuPackages
is
type curRefStudent is REF CURSOR RETURN student%rowtype;
procedure insertStudent(stuid in student.stu_id%type,stuname in student.stu_name%type,stusex in student.stu_sex%type,studate in student.stu_birthday%type);
Function QueryStudent(stuid in student.stu_id%type) return student%rowtype;
end StuPackages;
-程序包主体
定义子程序,实现声明部分
create package body 包名 is|as 变量声明|类型定义|异常声明|游标声明|函数定义|过程定义
end [包名];
CREATE OR REPLACE
PACKAGE BODY STUPACKAGES AS
procedure insertStudent(stuid in student.stu_id%type,stuname in student.stu_name%type,stusex in student.stu_sex%type,studate in student.stu_birthday%type) AS
i INTEGER;
Student_Exist EXCEPTION;
BEGIN
select count(*) into i from student where stu_id = stuid;
if i>0 then
raise Student_Exist;
else
insert into student values(stuid,stuname,stusex,studate);
commit;
end if;