Oracle8i新特性.

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

作業一 : USING DBMS ( 使用 DB2 及 SQL 基本練習 ) 報告人:學生楊群期 學號: 課程 : 高等資料庫 講師 : 楊維邦教授.
第5章 关系数据库标准语言SQL 主讲:张丽芳.
第2章 SQL语言初步 2.1 SQL的基本概念 2.2 基本表、索引的创建、删除和修改操作 2.3 SQL的查询语句——SELECT
第2讲 Transact-SQL语言.
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
第四章 数据库对象.
第3章 SQL语言初步 2017/3/14.
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
資料庫 (Database) SQL Server 2008實作
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
数据库原理及设计 --作业.
Chap 13 視界與資料庫程式設計.
第三章 管理信息系统的技术基础 主要内容: 数据处理 数据组织 数据库技术 4. 计算机网络.
计算机应用基础 上海大学计算中心.
Oracle数据库 Oracle 子程序.
PL/SQL程序设计 过程, 函数 Trigger 对象关系数据库技术.
主机DB2数据库应用与编程 任课老师:王湖南 四川大学计算机(软件)学院.
第14章 c++中的代码重用.
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
第11章 详细设计.
關聯式資料庫.
Oracle数据库入门.
数据库技术 第十章 数据库完整性 中国科学技术大学网络学院 阚卫华.
作业4讲评.
第六章 學習SQL語言.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
資料庫系統 Database Systems
課程名稱:資料庫系統 授課老師:李春雄 博士
Hadoop I/O By ShiChaojie.
实验二 交互式SQL 邓云.
数据库技术 第三章 关系数据库标准语言SQL 中国科学技术大学网络学院 阚卫华.
2、掌握SQL中各种查询方法和数据更新方法 3、掌握SQL中视图的定义方法和用法 4、掌握SQL的授权机制
Chap 10 SQL定義、操作與控制指令.
資料庫安全 (Database Security)
課程名稱:資料庫系統 授課老師:李春雄 博士
MySQL数据库基础与实例教程 之 MySQL表结构的管理 郭水泉.
第三章:包   包(package)是一个可以将相关对象存储在一起的PL/SQL结构。包包含了两个分离的部件------包说明(specification)和包主体(body)。每个部件都单独被存储在数据字典中。包只能存储在数据库中,不能是本地的。除了可以将相关对象作为一组存在一起以外,包也是十分有用的,因为它们在依赖性方面的限制是比较小的。也有许多性能上的优点。
走进编程 程序的顺序结构(二).
辅导课程六.
第三章作业讲评 文洁 2012/4/10.
SQL SERVER 一些经典语句 1.
实验4:PL-SQL编程 1.实验目的 2.实验原理 PL/SQL是一种过程化语言,属于第三代语言,本实验在与熟悉使用PL/SQL编程.
数据库基础 1.
作业3-点评.
段磊 王慧锋 TEL: qq群: 数据库系统原理课程设计 实验环节2 段磊 王慧锋 TEL: qq群:
第二章 Java语言基础.
泛型委托 泛型接口、方法和委托.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
ORACLE 第九讲 触发器.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
第三章作业点评 助教: 干艳桃、张榆 Contact 干艳桃
4.2 视图 (1) 视图是一个虚拟表,其内容来自对表查询的基础上。
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
SQL查询语句 蔡海洋.
VB与Access数据库的连接.
第三章 SQL Server数据管理.
第4章 Excel电子表格制作软件 4.4 函数(一).
1.把下面的关系模式转化为E-R图 1)系(系号,系名,电话) 2)教师(工号,姓名,性别,年龄,系号)
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
基于列存储的RDF数据管理 朱敏
VB与Access数据库的连接.
WEB程序设计技术 数据库操作.
第4章 数据查询.
Presentation transcript:

Oracle8i新特性

对象关系数据库 1.1 传统关系模型的缺点 1.2 面向对象(oop)的基本概念 1.3 对象类型(object) 1.4 收集类型(collection) 1.5 对象视图(object view)

数据模型是模型化数据和信息的工具。 现实世界 信息世界-概念模型 认识 抽象 转换 机器世界- DBMS支持的数据模型

E-R图转换成关系模式 1 : 1 领导 系主任 系 1 系(系名,类别,系主任) 系主任 ( 工作证号, 姓名, 年龄)

E-R图转换成关系模式 1 : N 包括 班级 学生 1 N 班级(班号,班主任,系) 学生(学号,姓名,性别,班号)

M : N E-R图转换成关系模式 学生(学号,姓名,性别,班号) 课程(课号,课名,学分) 选课(学号,课号,成绩) 实体集 - 关系 联系-关系:由联系的各实体集主码属性, 以及联系本身的属性组成。

关系模型的特点 关系模型的概念单一,实体和联系都是用关系来表示 关系必须是规范化的关系,要求每一分量不可再分 支持关系语言,具有高度非过程化,支持集合运算 通过外来码实现联系 关系模型有严格的数据基础

传统关系模型存在的缺陷 复杂属性只能拆分成并列的单一属性 无法表示变长的属性 无法直接表示嵌套表 必须大量使用JOIN来实现多表查询

1.2 面向对象(oop)的基本概念 类和对象 方法和封装 继承和子类 多态性

类和对象 当前流行的程序设计方法: 类(Class)或抽象数据类型(ADT): 是具有相同特征的事物的抽象表示 类的属性或特征 类的方法 对象是类的一个实例 当前流行的程序设计方法: 类:按钮 属性:大小、TEXT 方法:clicked 对象:一个确认按钮

方法和封装 方法是操纵对象类型的过程 方法用于封装对象 封装是对对象的一种保护方法,它决定着对象如何被访问 封装对用户和开发人员隐藏了底层开发的细节

继承和子类 Entity Round Angle Polyangle Triangle Circle Ecllipse Rectangle 任何对象类型可以通过创建子类的方法定义,子类延用了上级的属性 用继承实现代码重用 Entity Round Angle Polyangle Triangle Circle Ecllipse Rectangle

1.3 对象类型 扩充的类型系统 Oracle是一个开放的类型系统,增加了复杂的数据类型以及用户自定义类型 用户定义的数据类型使得可以在数据库中为现实世界的对象建模 应用逻辑从应用程序中移动到数据库中

对象类型 对象类型必须包含一个或多个属性 属性的类型可以是Oracle的原始数据类型、LOB、对象、对象的引用REF、收集COLLECTION 可以有1个或多个方法 对象类型不存储数据;必须创建相应的表来存储数据

对象类型 例子:定义对象类型 CREATE TYPE name_type AS OBJECT ( first_name VARCHAR2(30), last_name VARCHAR2(30)); CREATE TYPE address_type AS OBJECT ( street VARCHAR2(30), city VARCHAR2(20), zip VARCHAR2(7));

对象类型 CREATE TYPE cust_type AS OBJECT( custid NUMBER, invoice VARCHAR2(1), name name_type, address address_type); CREATE TABLE customer ( custid NUMBER PRIMARY KEY, name NAME_TYPE, address address_type); CREATE TABLE customers OF cust_type (custid PRIMARY KEY);

对象类型 对象存储:包含嵌套对象类型的表的存储是顺序的,类似于关系表的存储 custid, invoice, name.first_name, name.last_name, address.street, address.city, address.zip

对象类型 CREATE TYPE,CREATE TYPE BODY DROP TYPE ,DROP TYPE BODY 对象类型的DDL命令 CREATE TYPE,CREATE TYPE BODY DROP TYPE ,DROP TYPE BODY ALTER TYPE,ALTER TYPE BODY (不能增加属性,只能增加方法或编译类型) GRANT/REVOKE EXECUTE ON TYPE

对象类型--行对象 CREATE TYPE name_type AS OBJECT ( first_name VARCHAR2(30), last_name VARCHAR2(30) ) ; CREATE TABLE customers OF name_type; SELECT REF(C) FROM customers c;

对象类型--行对象 对象表的一行代表对象类型的一个实例 对象表的列对应于对象类型的属性 每一个实例有系统产生的唯一的OID 对象ID(OID)是每一个行对象的唯一描述符,是全局唯一的,并且自动索引 但OID不用于定位数据, 而ROWID用于定位数据 包含OID的对象实例可以被引用(REF)

对象类型--列对象 对象类型可以定义为列的数据类型 存储在列中的类型实例没有OID,而且不能被引用 CREATE TABLE employees ( custid number, invoice varchar2(1), name name_type, address address_type);

对象类型 INSERT INTO employees 对象索引 索引列必须为基本类型 构造数据 对象属性和方法的引用 采用.引用方式引用对象的属性和方法 对象属性和方法的引用必须使用表的别名,而不能是实际的表名 INSERT INTO employees VALUES(1, ‘a’, name_type(‘Jone’,’Jackson’), address_type(‘s’,’c’,’z’)); SELECT c.name.first_name, c.name.last_name FROM employees c;

对象类型--REF举例 为每行产生 一个OID INSERT INTO customers VALUES (1, '1', CREATE TYPE cust_type AS OBJECT ( custid number, invoice varchar2(1), name name_type, address address_type ) ; CREATE TABLE customers of cust_type (custid PRIMARY KEY ) ; 为每行产生 一个OID INSERT INTO customers VALUES (1, '1', name_type('Jone','Jackson'), address_type('st','ci','11')); SELECT REF(s) FROM customers s;

对象类型--REF举例 区别外码引用 和REF CREATE TABLE orders ( orderid number, orderdate date, status varchar2(4), customer REF cust_type, qty number, partno number REFERENCES parts ) ; 区别外码引用 和REF

对象类型--对象引用REF 对象引用(REF): 是系统产生的用于定位OID的值 REF在引用表中存储被引用表内的OID 是指向行对象的指针, 易于实现表和表之间的联系,对象之间访问被引用的对象不再需要关系JOIN 将对象表的表别名作为REF的参数可以取得REF的值 只能用于具有OID的对象 . 用于对象引用

FROM orders o WHERE o.orderid = 1; 对象类型--REF举例 .name .first_name INSERT INTO orders SELECT 2, '7-10月-99', '2222', ref(c), 1000 FROM customers c WHERE c.custid=1; UPDATE orders o SET o.customer = ( SELECT REF( c ) FROM customers c WHERE custid = 2 ) WHERE o.orderid = 1 ; SELECT o.customer FROM orders o WHERE o.orderid = 1; .name .first_name

对象类型--对象引用REF DEREF 用于返回被引用对象中的数据 将包含REF的对象表列作为阐述可以取得对象的数据 SELECT DEREF( o.customer ) FROM orders o WHERE orderid = 1 ;

对象类型--REF简化了代码 在关系设计中, 开发人员必须使用联合(JOIN) 服务器管理对象间的关系,用户只需通过属性进行引用 SELECT o.orderid, c.name FROM orders o, customers c WHERE c.custid = o.custid and c.custid =1; 服务器管理对象间的关系,用户只需通过属性进行引用 SELECT o.orderid, o.customer.name, o.status FROM orders o WHERE o.customer.custid = 1;

对象类型--VALUE VALUE使用对象表中的 实例初始化PL/SQL变量 VALUE用于从对象表中取得对象实例 取得的对象实例必须被相同类型的对象变量接收 不使用VALUE, SELECT只能返回一个对象的各个列值 DECLARE cust_variable cust_type; BEGIN SELECT VALUE( c ) INTO cust_variable FROM customers c WHERE custid = 789 ; END; VALUE使用对象表中的 实例初始化PL/SQL变量

对象类型--方法 方法是一个过程或函数, 是对象类型定义的一部分 对象类型总是有1到多个方法 方法的种类 成员方法 (member) 构造子方法 (constructor) MAP或ORDER方法

对象类型--成员方法 CREATE TYPE employee_type AS OBJECT( empno number, 用户编写的用于操纵对象类型属性的子程序 成员方法可以带输入输出参数 对象类型有0到多个成员方法 执行方法的格式为: <对象名称>.<方法名称>([参数列表]) CREATE TYPE employee_type AS OBJECT( empno number, ename varchar2(30), hiredate date, MEMBER FUNCTION days_at_company RETURN number);

对象类型--成员方法 CREATE TYPE BODY employee_type AS MEMBER FUNCTION days_at_company RETURN NUMBER IS BEGIN RETURN floor(sysdate - hiredate); END; CREATE TABLE employees OF employee_type; INSERT INTO employees VALUES (1, ‘Jone’, ‘10-10月-89’); select c.days_at_company() from employees c where c.id=1;

对象类型--执行方法(例) DECLARE emp_variable employee_type; days_employed number; BEGIN SELECT VALUE( e ) INTO emp_variable FROM employees e WHERE e.empno = 801 ; days_employed := emp_variable.days_at_company() ; dbms_output.put_line(‘Days employed: ‘ || to_char(days_employed)) ; END;

对象类型--构造子方法 构造子方法初始化一个对象类型的实例, 并将它的属性赋值 每一个对象类型自动包含一个构造子方法 构造子方法的名称采用对象名 构造子方法的参数即对象类型的所有属性 CREATE TYPE name_type AS OBJECT ( first_name VARCHAR2(30), last_name VARCHAR2(30) );

对象类型--构造子方法 CREATE TYPE address_type AS OBJECT ( street VARCHAR2(30), city VARCHAR2(20), zip VARCHAR2(7) );

对象类型--使用构造子方法 构造子初始化对象类型, 为各个属性赋值 CREATE TYPE cust_type AS OBJECT ( custid number, invoice varchar2(1), name name_type, address address_type ); CREATE TABLE customers of cust_type (custid PRIMARY KEY); INSERT INTO customers VALUES ( 1, N, name_type(‘Jim’,’ Smith’), address_type(‘Main Street’, ‘New York’, ‘10010’) ); 构造子初始化对象类型, 为各个属性赋值

对象类型--排序和比较对象 传统的数据类型(如: number, date)易于排序和比较 对象类型由于结构复杂, 必须借助方法实现排序和比较 MAP方法将对象类型转换为传统数据类型 ORDER方法比较两个对象实例, 返回1, 0, -1 一个对象类型只能有一个MAP方法或一个ORDER方法

对象类型--排序和比较对象 MAP方法 方法返回一个传统数据类型用于排序 没有输入参数(有一个隐含参数) 被隐含调用, 以决定下面表达式的结果 相等 , 小于, 大于的比较 BETWEEN 和 IN的判断 ORDER BY, GROUP BY 子句 UNIQUE和PRIMARY KEY约束

CREATE TYPE name_type AS OBJECT ( first_name varchar2(30), last_name varchar2(30), MAP MEMBER FUNCTION name_map RETURN varchar2 ); CREATE TYPE BODY name_type AS RETURN varchar2 IS BEGIN RETURN last_name || first_name; END; 任何基于name_type类型 定义的表按名称的拼接串 作为排序和比较的依据

对象类型--排序和比较对象 create table customers SELECT c.custid FROM customers c (custid number primary key, name name_type); insert into customers values (1, name_type('Mike','Jackson')); (2, name_type('Alice','Smith')); SELECT c.custid FROM customers c ORDER BY c.name ; MAP方法隐含调用

对象类型--排序和比较对象 ORDER方法 决定类型实例的序列关系 有一个参数(外加一个隐含的参数) 返回一个整数 如果当前对象比比较对象小, 返回 -1 如果当前对象与比较对象相等, 返回 0 如果当前对象比比较对象大, 返回 1

1.4 收集类型 实现一对多关系的模型化 在关系设计中只能通过联接(JOIN)实现表的关联, 将导致复杂的运算 在对象设计中可以通过收集实现对象类型的关联(嵌套表), 定义一次,使用多次 排序或不排序的收集类型 数组 (Arrays 排序的收集) 嵌套表 (不排序的收集)

收集类型--数组 数组 支持有序的一对多的关系 数组元素的类型: 基本类型或对象类型 变长的数组: VARRAY 元素具有相同类型 应指定最大容量 元素不能为嵌套表或VARRAY

CREATE TYPE phone_number_type AS OBJECT ( line_code VARCHAR2(10), phone_number VARCHAR2(40) ); CREATE TYPE phone_list_type AS VARRAY(7) OF phone_number_type; CREATE TYPE customer_type AS OBJECT custid NUMBER, name VARCHAR2(50), address address_type, contact VARCHAR2(50), phone_nums phone_list_type, MEMBER FUNCTION add_phone(new_phone phone_number_type) RETURN phone_list_type, ) ;

CREATE TYPE BODY customer_type AS MEMBER FUNCTION add_phone (new_phone phone_number_type) RETURN phone_list_type IS temp_array phone_list_type; counter INTEGER; BEGIN temp_array := SELF.phone_nums; counter := temp_array.COUNT +1; temp_array.EXTEND; temp_array(counter) := new_phone ; delete * from emp; commit; RETURN temp_array; END; CREATE TABLE customers OF customer_type;

收集类型--变长数组(例) INSERT INTO customers VALUES (8901, ‘Oracle Corp’, address_type(‘500 way’, ‘CA’, 94002), ‘Jim Smith’, phone_list_type( phone_number_type(‘Phone’, ‘506-0000’), phone_number_type(‘Fax’, ‘506-0001’) ) ); UPDATE customers c SET c.phone_nums = c.add_phone(phone_number_type(‘Cell’, ‘506-9999’)) WHERE c.custid = 8901;

收集类型--收集的方法 收集(collection)的方法: 内置的函数和过程 (见PL/SQL手册) EXISTS COUNT LIMIT FIRST and LAST PRIOR and NEXT EXTEND TRIM DELETE

编译指令 格式: PRAGMA RESTRICT_REFERENCES ( 编译软件包中的函数或过程时, 可以使用PRAGMA编译指令通知PL/SQL编译器禁止对表中的数据和过程中的变量读或修改, 当出现违反情况时, 编译出错 格式: PRAGMA RESTRICT_REFERENCES ( function_name, WNDS [, WNPS] [, RNDS] [, RNPS]); WNDS ”不允许写数据库” RNDS “不允许读数据库” WNPS “不允许写程序包” RNPS “不允许读程序包, 即不允许引用程序包变量”

收集类型-嵌套表 嵌套表 嵌套表是包含在其它表中的表 每一个嵌套表记录逻辑上是一个单独的表, 但物理上只创建一个表存储各个嵌套表的所有记录 支持无序的一对多的关系 元素类型: 基本类型集或对象集 查询通过对主表的查询来完成 可以索引嵌套表的列

收集类型--嵌套表(SQL例) CREATE TYPE project_type AS OBJECT ( pno NUMBER, pname VARCHAR2(30), budget NUMBER ); CREATE TYPE project_set_type AS TABLE OF project_type; CREATE TYPE dept_type AS OBJECT ( dept_no NUMBER, dname VARCHAR2(32), projects project_set_type ); CREATE TABLE depts OF dept_type NESTED TABLE projects STORE AS projects_store; INSERT INTO depts VALUES (838, ‘Finance’, project_set_type());

收集类型--嵌套表(PL/SQL例) DECLARE temp_project project_set_type; BEGIN SELECT projects INTO temp_project FROM depts WHERE dept_no=838; temp_project.TRIM; UPDATE depts SET projects = temp_project WHERE dept_no = 838; END;

收集类型--嵌套表(CAST例) 将查询的结果(未命名的收集)转换为嵌套表类型(命名的收集) CREATE TABLE project_loop OF project_set (pono PRIMARY KEY); INSERT INTO depts VALUES (615, ‘Accounting’ CAST(MULTISET (SELECT pno, pname, budget FROM project_loop ) AS project_set_type ) );

收集类型--嵌套表作为表 INSERT INTO THE (SELECT projects FROM depts WHERE dept_no = 615 ) VALUES (876, ‘Month end close’, 8876 ); SELECT pname FROM THE (SELECT projects FROM depts WHERE dept_no=615);

收集类型--嵌套表作为表 DELETE THE ( SELECT projects FROM depts WHERE dept_no=123 ) p WHERE p.pno IN (789, 456) UPDATE THE (SELECT projects FROM depts WHERE dept_no = 615 ) proj SET proj.budget = proj.budget * 1.5 WHERE proj.pname = ‘Oracle8 Object Technology’;

收集类型--嵌套表的存储 嵌套表的索引 从逻辑上每一行都是单独的一个嵌套表, ORACLE为嵌套表列构造一个物理表结构, 称为存储表 存储表的存储参数可以单独设置 嵌套表的索引 在父表的嵌套表列自动创建唯一性索引(NESTED_TABLE_ID) 在嵌套表上不自动创建索引 为提高性能, 建议在存储表的NESTED_TABLE_ID列上创建一个索引

变长数组与嵌套表的比较 变长数组 有序的收集 小于4K时在线存储 不支持索引 元素个数有上限 不支持SQL的增删改 适用于小数据量和知道上限的数据量 嵌套表 有多个子集, 无序 不在线存储 支持索引 无上限 支持SQL的增删改 适用于大数据量

收集的比较运算 收集如何比较 可以取到应用程序中, 再进行比较 包含收集的对象类型可以通过MAP或ORDER方法进行比较 收集不可以用在下列场合 索引列 UNIQUE, PRIMARY或FOREIGN KEY约束 包含DISTINCT, GROUP BY, ORDER BY或集合运算的SELECT语句 比较运算符 (=, <=, >=, IN, =ANY等等)

1.6 对象视图 对象视图是对关系视图的扩展 对象视图将关系表中存储的数据对象化 提供访问关系数据的对象应用支持 对象视图可以修改 视图可以基于关系数据或对象数据 视图可以返回一般的列或对象 对象视图有OID(象对象表一样) OID可以取自对象基表 否则, OID必须是能够唯一标识基表一行的用户自定义关键字

对象视图--返回对象列的视图 CUST_VIEW视图返回四列, 一列是对象 CREATE TABLE cust_tab ( cno NUMBER(6) PRIMARY KEY, name CHAR(45), street CHAR(50), city CHAR(20), state CHAR(2), zip NUMBER(5,0), credit NUMBER ) ; CREATE TYPE address_type AS OBJECT ( str CHAR(50), cty CHAR(20), st CHAR(2), zip NUMBER(5, 0) ); CREATE VIEW cust_view( no, name, addr, cr) AS SELECT cno, name, address_type(street, city, state, zip), credit FROM cust_tab;

对象视图--基于对象表 视图返回带有OID的CITY_ADDR_TYPE对象, 这个OID来自视图的基表ADDRESS_TAB CREATE TABLE address_tab OF address_type; CREATE TYPE city_addr_type AS OBJECT ( city CHAR(20), state CHAR(2), zip NUMBER(5, 0)); CREATE VIEW city_addr_view OF city_addr_type AS SELECT cty, st, zip FROM address_tab;

对象视图的修改 来自对象类型属性的视图列自动可修改 可变数组和嵌套表列不可自动修改 不可自动修改的列可以通过使用INSTEAD OF 触发器执行修改操作 可以为所有视图编写INSTEAD OF 触发器 不执行原语句而执行代替的触发器 CREATE TRIGGER emp_dept_delete INSTEAD OF DELETE on emp_dept_view FOR EACH ROW BEGIN delete from emp where eno = :old.eno; END;