一、作业
-
给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; -
有班级表和学生表,删除班级表中没有在学生表中用到的记录
-- 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); -
有两个表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;
二、触发器
-
概念
触发器不能主动调用,只有在对相应对象操作时自动触发。
-
触发器分类
-
DML触发器
-
替代触发器
-
系统触发器
-
-
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;
-
-
-
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;
-
-
替代触发器
-
解决复杂视图不能插入数据的问题
-
替代触发器的创建
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锁
-
-
悲观锁和乐观锁
-