ORACLE数据库笔记之事务处理触发器及函数

事务的特点(ACID)

A(atomacity)原子性:事务是一个整体,组成事务的处理语句形成一个逻辑单元,不能只执行其中的一部分。

C(consistency)一致性:事务执行前后数据库是一致的(数据库的完整约束)

I(isolation)隔离性:一个事务的处理不会影响另一个事务的处理,相互之间是隔离的

D(durability)持久性:事务处理的效果可以被永久性保存下来

注意:一个事务要吗成功要吗失败不会一部分成功一部分失败的

事务的结束

(1)显示结束:执行了commit或者rollback

(2)隐式提交:执行完了ddl或者dcl语句或者exit退出

(3)隐式回滚:系统异常关闭,死机断电

事务的四种隔离级别

为了避免并发是产生数据的脏读、不可重复读还有幻读的问题设置了数据库的四种隔离级别

readuncommited            允许事务读取未被其它事务提交的变更的数据,此隔离级别上述四种问题均会出现

readcommited              只允许事务读取被其它事务提交的变更的数据,此隔离级别可以避免脏读但还会出现其它三种问题

repeatable read           确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它是事务对这个字段进行更新,此

                          隔离级别可以避免脏读和不可重复读但其它两个问题依然存在

serializable              确保事务可以从一个表中读取到相同的行,在这个无持续期间,不允许其它事务对该表进行操作,此隔离级别可

                          以处于所有问题

存储过程

存储过程是值存储在数据库中提供所有用户程序调用的子程序,是存储在数据库中的一条sql语句

(1)存储过程的创建

   create [or replace] procedure 存储过程名字[(参数列表)]

   as

   pl/sql子程序体

 注意:参数列表中格式为:参数名  in(out) 参数类型,其中in为要输入的参数,out为存储过程要返回的

(2)存储过程的使用

  set severoutput on;

  exec 存储过程名([参数]);

  或者用begin

          存储过程名();

         end;的pl/sql块

--无参数无返回值的过程
create or replace procedure nine
as
i number:=0;
begin
   WHILE (i<=9) LOOP
             DECLARE J NUMBER(10):=1;
             BEGIN
               WHILE (J<=i) LOOP
                 DBMS_OUTPUT.put(I||'*'||J||'='||(i*J)||'     ');
                 J:=J+1;
               END LOOP;
              DBMS_OUTPUT.put_line('');
               i:=i+1;
            END;
           END LOOP;
end;
--调用过程
set serveroutput on;
--execute nine();
begin
 nine();
end;
--有参数无返回值的过程
create or replace procedure newnine
(num1 in number,num2 in number )
as
i number:=1;
begin
  while i<=num1 loop
     declare j number(10):=1;
     begin
       while j<=num2 loop
          dbms_output.put(i||'*'||j||'='||j*i||'     ');
          j:=j+1;
       end loop;
      dbms_output.put_line(' ');
       i:=i+1;
     end;
  end loop;
end;
--调用带参数的过程
set serveroutput on;
execute newnine(5,6);
--有参数有返回值的
create or replace procedure mycardid
(cardid out char)
as
   num number(8);
   myid char(9);
begin
  select dbms_random.value(10000000,99999999) into num from dual;
  select to_char(num) into myid from dual;
  cardid:=substr(myid,1,4)||' '||substr(myid,5,4);
  dbms_output.put_line(cardid);
end;
--调用过程
set serveroutput on;
declare
  newmyid char(9);
begin
  mycardid(newmyid);
end;

 触发器

    (1)触发器是是一个与表相关联的,存储的pl/sql程序,每当发出一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,oracle都会自动的触发定义的语句序列

    (2)触发器的类型:语句级的触发器在指定的操作语句之前或者之后执行一次,不管这条语句影响了多少行

                       行级触发器是在每一条语句之前或者之后执行时,都会触发。需要注意的是只有行级触

                       发器中可以使用:old和:new伪记录变量,识别值的状态

   (3)触发器的创建                   

   CREATE  [or REPLACE] TRIGGER  触发器名

   {BEFORE | AFTER}

   {DELETE | INSERT | UPDATE [OF 列名]}

   ON  表名

   [FOR EACH ROW [WHEN(条件) ] ]

   PLSQL 块

     (4)触发语句与伪记录变量的值

        

触发语句

:old

:new

Insert

 

将要插入的数据

Update

更新以前该行的值

更新后的值

delete

删除以前该行的值

 
drop sequence pid;
create sequence pid;
drop table student;
create table student(
  id int primary key,
  name varchar2(10) not null
);
insert into student values(pid.nextval,'张三');
create or replace trigger stuid
before insert on student 
for each row
declare
   myid  int;
begin
    select pid.nextval into myid from dual;
    :new.id:=myid;
end;
insert into student(name) values('王五');

   (5)查询触发器函数及过程

      select * from user_triggers;

      select * from user_source;

函数的创建

 函数为一个命名的存储过程,可带参数,并返回一个计算值,函数和过程的结构类似但必须有一个return子句,用户返回函数值

 (1)函数的创建过程 

CREATE [OR REPLACE] FUNCTION 函数名(参数列表)

 RETURN  函数值类型

AS

PLSQL子程序体;

 (2)函数的调用

   可以当作表达式来使用,出现表达式的地方均可以使用函数

  例:select 函数名()from dual;

--函数的创建
create or replace function f1
return varchar2--注意必须有返回,且指定返回类型
as
begin
return 'hello';
end;
--函数的调用
select f1() from dual;
set serveroutput on;
begin
   dbms_output.put_line(f1());
end;
--带参数的函数创建
create or replace function mrstr(str varchar2)
return varchar2
as
   v_str varchar2(20);
begin 
   v_str:=regexp_replace(str,' ','');
   return v_str;
end;
--带参数的函数的调用
select mrstr('       t       r         ')||'lzl' from dual;
set serveroutput on;
begin
  dbms_output.put_line(mrstr('           za      r')||'lzl');
end;

  (3)如果只有一个返回值用存储函数,如果有多个返回过程就使用存储过程

有多大成功就承受过多大压力
原文地址:https://www.cnblogs.com/lzlnd/p/4815222.html