zoukankan      html  css  js  c++  java
  • Oracle第十一课

    Oracle第十一课

    一、课后作业讲解

    • 给一个字符串,'7788,5566,2233'员工编号,传入存储过程,删除这些员工 记录,并给出这些员工删除的结果'true,false,true'删除成功true,否则false,以字符串形式返回。 比如5566删除失败(原因可能是不存在该记录,判断依据用系统隐式游标的rowcount属性) 注:要拆分传入的员工编号字符串为单个的员工编号

      --1.删除的存储过程
      CREATE OR REPLACE PROCEDURE p_delete(ids VARCHAR,-- 要删除的ids
                                          rs OUT VARCHAR) -- 删除的结果
      IS
      v_ids VARCHAR(50) :=ids;-- 赋值给变量,因为入参无法改变
      v_id VARCHAR(5);-- 截取出的id
      n NUMBER;-- 逗号的位置
      BEGIN
       LOOP
         EXIT WHEN v_ids IS NULL;-- ids为null时退出循环
        n:=INSTR(v_ids,',');-- 找逗号的位置
         IF n=0 THEN -- 没有逗号
          v_id:=v_ids;
          v_ids:=NULL;-- ids变为null,标识着准备退出循环
         ELSE
          v_id:=SUBSTR(v_ids,1,n-1);-- 找逗号前的id
          v_ids:=SUBSTR(v_ids,n+1);-- ids更改为剩下的id信息
         END IF;
         DELETE FROM emp WHERE empno=v_id;-- 删除记录
         IF SQL%ROWCOUNT=1 THEN -- 判断结果
           IF rs IS NULL THEN-- 拼接结果
            rs:='true';
           ELSE
            rs:=rs||',true';
           END IF;
         ELSE
           IF rs IS NULL THEN
            rs:='false';
           ELSE
            rs:=rs||',false';
           END IF;
         END IF;
       END LOOP;
      END;
      --2.调用存储过程
      -- Created on 2021/1/26 by DELL
      declare
      v_result VARCHAR2(50);
      BEGIN
       -- 删除id=1 id=2 id=3 结果为result1,result2,result3
      p_delete('1,2,3',v_result);
       COMMIT;
      dbms_output.put_line('execute result:'||v_result);
      end;

    二、触发器

    1. 定义

      触发器是附加在数据库对象上的一段代码,它指定了触发的时机和事件,触发器一般建立在表或视图上,也可以建立在用户或数据库层面上。触发器不能主动调用,只有在对相应对象操作时自动触发。

      自动触发(指定触发的事件,增,删,改,登录,登出,重启,关闭)

      可以在某个事件前,后触发(还有替代)

      触发器比较隐蔽,发生问题不好定问,可以考虑是否用存储过程或其他技术来替代

    2. 根据触发器作用的对象分为三种:DML触发器,替代触发器,系统触发器

    3. DML触发器(触发器的粒度)

      • 语句级触发器(对sql操作只做一次触发)

        • 建一个日志表,给emp表创建一个语句级DML触发器,操作数据时在日志表中记日志

          -- 创建日志表
          CREATE TABLE t_log(ID NUMBER PRIMARY KEY,
          log_user VARCHAR2(20),
          log_date DATE,
          log_text VARCHAR2(100));
          -- 创建一个触发器
          CREATE OR REPLACE TRIGGER trg_emp1
          BEFORE INSERT OR UPDATE OR DELETE
          ON emp
          DECLARE
          v_event VARCHAR(10);
          BEGIN
           IF inserting THEN
            v_event:='insert';
          ELSIF updating THEN
            v_event:='update';
           ELSE
            v_event:='delete';
           END IF;
           INSERT INTO t_log VALUES(seq1.nextval,USER,SYSDATE,v_event||'on emp');
           END;
          -- 触发器状态
          alter trigger trg_emp1 disable;
          alter trigger trg_emp1 enable;
          -- 测试
          INSERT INTO emp(empno) VALUES(2);
          INSERT INTO emp(empno) VALUES(1);
          DELETE FROM emp WHERE empno IN(1,2);
          SELECT * FROM t_log;
      • 行级触发器(每行都会进行触发):for each row

        -- 创建新表,用原表数据填充
        CREATE TABLE emp2 AS SELECT * FROM emp;
        -- 创建新表,只要原表的结构
        CREATE TABLE emp3 AS SELECT * FROM emp WHERE 1=2;
        -- 创建行级触发器
        CREATE OR REPLACE TRIGGER trg_emp2
        BEFORE INSERT OR UPDATE OR DELETE
        ON emp
        FOR EACH ROW -- 行级触发器
        DECLARE
        BEGIN
         IF inserting THEN
           INSERT INTO emp2(empno,ename) VALUES(:new.empno,:new.ename);
        ELSIF updating THEN
           UPDATE emp2 SET ename=:new.ename WHERE empno=:old.empno;
         ELSE
           DELETE FROM emp2 WHERE empno=:old.empno;
         END IF;
         END;
        -- 测试数据
        INSERT INTO emp(empno) VALUES(2);
        INSERT INTO emp(empno) VALUES(1);
        DELETE FROM emp WHERE empno IN (1,2);
    4. DDL触发器

      -- 创建DDL触发器
      CREATE OR REPLACE TRIGGER trg_ddl
      AFTER DDL
      ON scott.schema
      DECLARE
      BEGIN
       INSERT INTO t_log(ID,log_user,log_date,log_text)
       VALUES(seq1.nextval,USER,SYSDATE,ora_sysevent||'-'||ora_dict_obj_name||'-'||ora_dict_obj_type);
      END;
    5. 替代触发器:解决复杂视图不能插入数据的问题

      -- 创建替代触发器
      CREATE OR REPLACE TRIGGER trg_vemp
      INSTEAD OF INSERT
      ON v_emp
      FOR EACH ROW
      DECLARE
      BEGIN
       INSERT INTO emp(empno,sal,comm) VALUES(:new.empno,:new.sal,0);
      END;
      -- 测试数据
      INSERT INTO v_emp(empno,sal) VALUES(3,100);

    三、事务

    1. 定义

      为了一个业务操作,有时需要操作多条sql,只有这些sql都完成后,一个业务操作才算完成,这个过程就叫事务。

      如果中间有一条sql出错,则全部回滚

      如果所有sql都完成,则需要提交

    2. 事务的四大特点:ACID

      • 原子性:Atomicity,要么都做,要么都不做

      • 一致性:Consistency,事务操作前和操作后都是平衡的

      • 隔离性:Isolation,多个事务并发对同一数据进行操作时,会有序操作,互不影响

      • 持久性:Durability,事务一旦提交,数据会永久保存起来,断电或重启都不会影响

    四、锁

    • 锁的分类

      • 从限制程序角度

        • 排他锁

        • 共享锁

      • 从产生时机角度

        • 自动锁

        • 显示锁

      • 从产生的操作角度

        • DML锁

        • DDL锁

      • 悲观锁和乐观锁

    软件下载提取码:qwer
  • 相关阅读:
    Spring Security(06)——AuthenticationProvider
    Spring Security(05)——异常信息本地化
    Spring Security(04)——认证简介
    Spring Security(03)——核心类简介
    Spring Security(02)——关于登录
    Spring Security(01)——初体验
    核心服务
    技术概述
    Security命名空间配置
    Spring Security
  • 原文地址:https://www.cnblogs.com/ty0910/p/14334312.html
Copyright © 2011-2022 走看看