`

qlsql 学习实例代码4

阅读更多
---------------------------行触发器  
SQL> create or replace trigger del_deptno    ---创建触发器
  2  after delete on dept                   ---定义动作
  3  for each row                           ---行触发               
  4  begin
  5  delete from emp where deptno =:old.deptno;         -----触发器要执行的语句
  6  end del_deptno;
  7  /

Trigger created

SQL> delete from dept where deptno = 10;

1 row deleted

SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

SQL> select * from emp;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH      CLERK      7902 1980-12-17     800.00               20
7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
7900 JAMES      CLERK      7698 1981-12-3      950.00               30
7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
    1 liwu                                                      

12 rows selected
---------------------------------------------------------
两个重要的内存表存在的情况      (old表和操作的表结构一致,new表是内存中存放数据的一张表)

insert  new
delete  old
update  old   new             


SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

SQL> select * from emp;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH      CLERK      7902 1980-12-17     800.00               20
7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10
7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
7839 KING       PRESIDENT       1981-11-17    5000.00               10
7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
7900 JAMES      CLERK      7698 1981-12-3      950.00               30
7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
7934 MILLER     CLERK      7782 1982-1-23     1300.00               10
    1 liwu                                                      
8000 john       java                          6000.00               10

16 rows selected

SQL> create or replace trigger update_dept             --创建更新触发器
  2  after update on dept
  3  for each row
  4  begin
  5  update emp set deptno =:new.deptno where deptno =:old.deptno;       ----牵扯到 new old 两张表
  6  end update_dept;
  7  /

Trigger created

SQL> update dept set deptno =11 where deptno=10;

1 row updated

SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    11 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

SQL> select * from emp;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH      CLERK      7902 1980-12-17     800.00               20
7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
7782 CLARK      MANAGER    7839 1981-6-9      2450.00               11
7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
7839 KING       PRESIDENT       1981-11-17    5000.00               11
7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
7900 JAMES      CLERK      7698 1981-12-3      950.00               30
7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
7934 MILLER     CLERK      7782 1982-1-23     1300.00               11
    1 liwu                                                      
8000 john       java                          6000.00               11

16 rows selected
------------------------------------------------触发器中的不能写commit rollback,那触发器如何实现对一些操作的阻止呢?

SQL> create or replace trigger del_dept
  2  after delete on dept
  3  for each row
  4  begin
  5  if :old.deptno = 20 then
  6  raise_application_error(-20000,'不允许删除');    ----强行报错语句    -20000到-20999,可随意写
  7  end if;
  8  end del_dept;
  9  /
 
Trigger created


SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    11 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

SQL> delete from dept where deptno =11;       ----删除其他成功

1 row deleted


SQL> delete from dept where deptno = 20;       ----删除20 不成功 报错

delete from dept where deptno = 20

ORA-20000: 不允许删除?ORA-06512: at "SYSTEM.DEL_DEPT", line 3
ORA-04088: error during execution of trigger 'SYSTEM.DEL_DEPT'

------------------------------------------------------------语句级触发器
SQL> desc mylog;
Name      Type          Nullable Default Comments
--------- ------------- -------- ------- --------
CURR_USER VARCHAR2(100) Y                        
CURR_DATE DATE          Y                        
ACT       CHAR(1)       Y                        

SQL> create or replace trigger dml_dept              ----创建语句级触发器
  2  after insert or delete or update on dept          ------触发的动作
  3  begin                                           
  4  if inserting then
  5  insert into mylog values(user,sysdate,'I');
  6  elsif deleting then
  7  insert into mylog values(user,sysdate,'D');
  8  else
  9  insert into mylog values(user,sysdate,'U');
10  end if;
11  end dml_dept;
12  /

Trigger created

SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

SQL> insert into dept values(50,'AAA','aaa');

1 row inserted
 
SQL> update dept set dname='BBB' where deptno=50;

1 row updated

SQL> delete from dept where deptno = 50;

1 row deleted

SQL> select * from mylog;

CURR_USER                                                                        CURR_DATE   ACT
-------------------------------------------------------------------------------- ----------- ---
SYSTEM                                                                           2010-4-4 15 I
SYSTEM                                                                           2010-4-4 15 U
SYSTEM                                                                           2010-4-4 15 D

--------------------------------------利用触发器进行自增
SQL> create or replace trigger set_no
  2  before insert on dept
  3  for each row
  4  declare
  5  sn number(5);
  6  begin
  7  select myseq.nextval into sn from dual;
  8  :new.deptno := sn;
  9  end set_no;
 10  /
 

Trigger created

SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON


SQL> insert into dept values(1,'A','d');      ----插入时写的deptno已经不起作用了,而是按照触发器中的序列进行自增。

1 row inserted

SQL> insert into dept values(50,'A','d');

1 row inserted

SQL> insert into dept values(60,'A','d');

1 row inserted

SQL> select * from dept;

DEPTNO DNAME          LOC
------ -------------- -------------
    69 A              d
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
    72 A              d
    66 A              d

6 rows selected
------------------------------------------------------替换触发器(在oracle中替换触发器只能建在视图上)

SQL> insert into v_emp_dept values(7903,'wangsu'2,'B','bbb');   ---v_emp_dept为两表关联的查询的试图

insert into v_emp_dept values(7903,'wangsu'2,'B','bbb')     ---不能插入视图

ORA-00917: missing comma

SQL> create or replace trigger tr_v_e_d         -----创建替换触发器 来解决此问题
  2  instead of insert on v_emp_dept
  3  for each row
  4  begin
  5  insert into dept(deptno,dname,loc) values(:new.deptno,:new.dname,:new.loc);
  6  insert into emp(empno,ename,deptno) values(:new.empno,:new.ename,:new.deptno);
  7  end tr_v_e_d;
  8  /

Trigger created

SQL> insert into v_emp_dept values(7093,'ws',2,'B','b');

1 row inserted


















































































































1
0
分享到:
评论

相关推荐

    plsql语法编程实例

    本资料包“plsql语法编程实例”提供了一系列SQL基础语法和PL/SQL编程实例,对于学习和掌握这一技能非常有帮助。 首先,SQL(Structured Query Language)是关系型数据库管理系统中用于管理和处理数据的标准语言。其...

    ORACLE PLSQL实例精解(第4版) 中文版

    ### ORACLE PL/SQL 实例精解(第4版)知识点概述 #### 一、PL/SQL基础 **1.1 PL/SQL简介** - **定义**:PL/SQL(Procedural Language for SQL)是一种过程化语言,专门用于增强Oracle数据库的功能。它将SQL命令与...

    plsql代码和学习资料

    总的来说,"PLSQL_code"压缩包中的内容可能是对PLSQL编程语言和Oracle 11g数据库管理系统的实战教程和实例代码,对于想深入了解和提升这方面技能的学习者来说,是非常宝贵的资源。通过深入学习和实践,你可以成为一...

    Oracle PLSQL实例精解(英文原书第4版)

    《Oracle PLSQL实例精解(英文原书第4版)》是Oracle数据库开发领域的一本经典著作,专注于讲解PL/SQL编程语言的应用。PL/SQL是Oracle数据库系统中用于处理结构化查询语言(SQL)的编程环境,它扩展了SQL的功能,使...

    PLSQL学习笔记(1-7)

    本“PLSQL学习笔记”将逐步讲解这些概念,通过实例和练习帮助读者巩固理解,进一步提升在Oracle数据库开发中的技能。无论你是初学者还是有经验的开发者,这份笔记都能提供有价值的参考。通过深入学习和实践,你将...

    PLSQL编程学习资料

    PLSQL是一种专为Oracle数据库设计的结构化查询语言扩展,它结合了SQL的查询...这些基本概念构成了PLSQL编程的基础,通过学习和实践,开发者可以创建复杂的数据库应用程序,实现数据处理、业务逻辑和数据验证等功能。

    PLSQL学习基础课件PPT

    本PLSQL学习基础课件PPT旨在为初学者提供深入浅出的教程,帮助他们掌握这一强大的数据库编程工具。 首先,我们要了解PLSQL的基本结构,它由声明部分、执行部分和异常处理部分组成。声明部分包括变量、常量、游标、...

    plsql建表实例.txt

    通过这个示例,我们可以学习如何在Oracle数据库中定义复杂的表结构,并理解不同类型的列约束、非空约束以及数据类型的选择等关键概念。 #### 创建表命令详解 在提供的部分代码中,我们看到一个名为`fare`的表被...

    Oracle PLSQL语法大全及实例讲解.pdf

    Oracle PL/SQL是一种强大...通过学习和实践这些基本概念,你可以构建复杂的PL/SQL程序来管理Oracle数据库中的数据,进行数据处理和业务逻辑实现。了解并熟练掌握这些知识点对于任何Oracle数据库开发者来说都至关重要。

    PLSql循序渐进全面学习教程

    10. **PLSql调试和错误处理**:学习如何使用Oracle的调试工具,以及如何编写健壮的错误处理代码,能帮助你快速定位和解决问题。 11. **数据库链接**:数据库链接允许你在不同的Oracle实例之间进行通信,这对于...

    ORACLE_PLSQL专家指南代码

    通过深入研究这个指南中的代码实例,你可以深化对PL/SQL的理解,提升解决实际问题的能力。同时,理解数据库的内部工作原理,如何有效地与SQL交互,以及如何利用PL/SQL提供的高级功能,都是成为一个真正Oracle PL/SQL...

    Oracle PLSQL 实例精解(第4版)完整版带目录

    《Oracle PLSQL 实例精解(第4版)》是一本深入探讨Oracle数据库中的PL/SQL编程语言的专业书籍。PL/SQL是Oracle数据库系统中用于处理数据的强大工具,它结合了SQL的查询能力与过程性编程语言的功能。本书旨在帮助读者...

    PLSQL学习资料

    学习保存程序的最佳实践,确保代码安全,便于后期修改和复用。 ##### 3.3 修改程序 熟悉编辑功能,如查找替换、代码折叠等,提高代码编辑效率。 ##### 3.4 编译程序 理解编译过程,识别并解决语法错误,确保代码...

    oracle-PLSQL实例精析

    8. **性能优化**:学习如何编写高效的PL/SQL代码,减少数据库访问,利用绑定变量提升性能。 9. **事务管理**:掌握BEGIN、COMMIT、ROLLBACK语句,理解事务的概念和其在保持数据一致性中的关键角色。 10. **数据库...

    PLSQL教程

    在PLSQL的学习过程中,"源码"可能是指编写和执行的存储过程、函数、触发器等代码片段,而"工具"可能指的是PLSQL Developer这样的集成开发环境,它为编写、调试和管理PLSQL代码提供了便利。 在压缩包中的两个文件名...

    Oracle PLSQL实例精解(原书第4版) 源码下载

    《Oracle PLSQL实例精解(原书第4版)》是一本深入探讨Oracle数据库编程语言PL/SQL的专业书籍。此书旨在帮助读者掌握PL/SQL的精髓,通过丰富的实例和详细解析,提升在Oracle数据库环境中的开发能力。作者在书中不仅...

    PLSQL操作ORALCE数据库

    通过PLSQL Developer,可以进行SQL性能分析,查看执行计划,定位性能瓶颈,帮助优化SQL语句和PLSQL代码,提升数据库的运行效率。 总结来说,PLSQL是Oracle数据库编程的核心工具,结合PLSQL Developer这样的专业开发...

    PLSQL学习基础资料

    本文将深入探讨"PLSQL学习基础资料"中的关键知识点,旨在为初学者提供一个全面的入门指南。 首先,让我们从"Oracle-SQL语言基础"开始。SQL(Structured Query Language)是用于查询、更新和管理关系数据库的标准...

    PLSQL电子书小合集

    这个“PLSQL电子书小合集”显然是一个包含了关于PLSQL学习资料的压缩包,可能包括教程、指南、实战案例等内容,对于想要深入理解和掌握PLSQL的用户来说非常有价值。 PLSQL的主要组成部分包括声明部分、执行部分和...

Global site tag (gtag.js) - Google Analytics