zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    在Ubuntu中通过update-alternatives切换软件版本
    SCons: 替代 make 和 makefile 及 javac 的极好用的c、c++、java 构建工具
    mongodb 的使用
    利用grub从ubuntu找回windows启动项
    How to Repair GRUB2 When Ubuntu Won’t Boot
    Redis vs Mongo vs mysql
    java script 的工具
    python 的弹框
    how to use greendao in android studio
    python yield的终极解释
  • 原文地址:https://www.cnblogs.com/ty0910/p/14336046.html
Copyright © 2011-2022 走看看