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
原文地址:https://www.cnblogs.com/ty0910/p/14336046.html