zoukankan      html  css  js  c++  java
  • 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)如果只有一个返回值用存储函数,如果有多个返回过程就使用存储过程

    有多大成功就承受过多大压力
  • 相关阅读:
    操作系统进程调度策略
    runnable & callable
    leetcode 124 二叉树中的最大路径和
    leetcode 24 两两交换链表中的节点
    leetcode 93 复原IP地址
    C++ 11 move
    leetcode 64 最小路径和
    leetcode 1143 最长公共子序列
    leetcode 528 按权重随机选择
    数据挖掘面试题(1)
  • 原文地址:https://www.cnblogs.com/lzlnd/p/4815222.html
Copyright © 2011-2022 走看看