• Oracle第十一课课后作业


    Oracle第十一课课后作业

    一、作业

    1. 给dept表建行级触发器,操作dept表的同时更新它的副表dept2

      增删改查时两张表数据同步

      -- 创建dept2为dept的副表
      CREATE TABLE dept2 AS SELECT * FROM dept;
      -- 创建触发器,在修改dept表时两张表数据同步
      CREATE OR REPLACE TRIGGER t_dept
      AFTER INSERT OR DELETE OR UPDATE
      ON dept
      FOR EACH ROW
      DECLARE
      BEGIN
       IF inserting THEN
         INSERT INTO dept2 VALUES(:new.deptno,:new.dname,:new.loc);
      ELSIF deleting THEN
         DELETE FROM dept2 WHERE deptno=:old.deptno;
       ELSE
         UPDATE dept2 SET dname=:new.dname,loc=:new.loc WHERE deptno=:old.deptno;
       END IF;
      END;
      -- 测试数据
      SELECT * FROM dept;
      INSERT INTO dept(deptno) VALUES(50);
      UPDATE dept SET dname='newname',loc='newloc' WHERE deptno=50;
      DELETE FROM dept WHERE deptno=50;
      SELECT * FROM dept2;
    2. 有班级表和学生表,删除班级表中没有在学生表中用到的记录

      -- 1.创建班级表
      CREATE TABLE t_clazz(id NUMBER PRIMARY KEY);
      -- 2.创建学生表
      CREATE TABLE t_student(ID NUMBER PRIMARY KEY,NAME VARCHAR(8),clazz REFERENCES t_clazz(ID));
      -- 3.向班级表中插入数据
      INSERT INTO t_clazz VALUES(&ID);
      -- 4.向学生表中插入数据
      CREATE SEQUENCE sq MINVALUE 0 START WITH 0;
      INSERT INTO t_student VALUES(sq.nextval,&NAME,&clazz);
      -- 5.删除班级表里没有学生的班级
      DELETE FROM t_clazz WHERE ID NOT IN (SELECT DISTINCT clazz FROM t_student);
    3. 有两个表A和B,均有c1和c2两个字段,如果A的c1记录在B中c1也有,就把B的c2换为A中对应的c2

      -- 1.创建A表
      CREATE TABLE A(c1 NUMBER,c2 NUMBER);
      -- 2.创建B表
      CREATE TABLE B(c1 NUMBER,c2 NUMBER);
      -- 3.插入数据
      INSERT INTO A VALUES(&c1,&c2);
      INSERT INTO B VALUES(&c1,&c2);
      -- 4.创建存储过程,修改B表
      CREATE OR REPLACE PROCEDURE p_up
      IS
      CURSOR c_up IS SELECT *  FROM A;
      v_row A%ROWTYPE;
      BEGIN
       FOR v_row IN c_up LOOP
         UPDATE B SET c2=v_row.c2 WHERE c1=v_row.c1;
       END LOOP;
      END;

    二、触发器

    1. 概念

      触发器不能主动调用,只有在对相应对象操作时自动触发。

    2. 触发器分类

      • DML触发器

      • 替代触发器

      • 系统触发器

    3. DML触发器

      • 触发器的粒度

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

        • 行级触发器:对每行数据都触发

        • 示例

          insert into emp(empno) where empno in (1,2);
          -- 语句级触发器就只触发一次
          -- 行级触发器会触发两次,因为这条sql语句影响两行
      • 创建触发器

        • 语句级触发器

          create or replace trigger 触发器名称
          after/before insert or update or delete
          on 表名
          delclare
          变量声明的地方
          begin
          end;
        • 行级触发器

          create or replace trigger 触发器名称
          after/before insert or update or delete
          on 表名
          for each row
          delclare
          变量声明的地方
          begin
          end;
    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;

    三、事务

    • 事务的四大特点

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

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

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

      • 永久性:当事务提交后,数据会永久保存,断电或重启不会产生影响

    四、锁

    • 锁的分类

      • 从限制程序角度

        • 排他锁

        • 共享锁

      • 从产生时机角度

        • 自动锁

        • 显示锁

      • 从产生的操作角度

        • DML锁

        • DDL锁

      • 悲观锁和乐观锁



    软件下载提取码:qwer
  • 相关阅读:
    深度学习
    !gcc !vi
    条件、循环及其他语句
    当索引行不通时
    我的排班日期
    Linux使用storcli工具查看服务器硬盘和raid组信息
    storcli64和smartctl定位硬盘的故障信息
    Shell-四剑客
    iostat
    /VAR/LOG/各个日志文件分析
  • 原文地址:https://www.cnblogs.com/ty0910/p/14336046.html
Copyright © 2020-2023  润新知