Oracle PL / SQL – INSTEAD OF触发器示例
本文向您展示如何使用INSTEAD OF TRIGGER
进行更新
- 非版本视图
- 非版本视图的嵌套表列
此INSTEAD OF
触发器提供了一种修改views
的方法,该views
无法直接通过DML语句(如INSERT,UPDATE和DELETE)进行修改
INSTEAD OF触发器是
- 始终是行级触发器。
- 可以读取旧值和新值,但不能更改它们。
- 不能是有条件的。 意味着我们不能添加WHEN或IF条件。
1.将数据插入视图
在此示例中,我们创建了一个INSTEAD OF
触发器,当我们在视图上执行insert语句时,它将在view
各个表中插入行。
1.1创建表。
CREATE TABLE customer_details
(customer_id number(10) primary key,customer_name varchar2(20),country varchar2(20)
);
CREATE TABLE projects_details
(project_id number(10) primary key,project_name varchar2(30),project_start_Date date,customer_id number(10) references customer_details(customer_id)
);
1.2创建customer_projects_view
视图以获取客户及其项目的结果。
CREATE OR REPLACE VIEW customer_projects_view ASSELECT cust.customer_id, cust.customer_name, cust.country,projectdtls.project_id, projectdtls.project_name, projectdtls.project_start_DateFROM customer_details cust, projects_details projectdtlsWHERE cust.customer_id = projectdtls.customer_id;
1.3如果我们直接将INERT插入customer_projects_view
视图,则数据库将引发以下错误:
INSERT INTO customer_projects_view VALUES (1,'XYZ Enterprise','Japan',101,'Library management',sysdate);-- output
SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view whichmap to a non-key-preserved table.
*Action: Modify the underlying base tables directly.
1.4相反,我们应该在视图上创建INSTEAD OF
触发器以执行实际操作。
CREATE OR REPLACE TRIGGER trg_cust_proj_view_insertINSTEAD OF INSERT ON customer_projects_viewDECLAREduplicate_info EXCEPTION;PRAGMA EXCEPTION_INIT (duplicate_info, -00001);BEGININSERT INTO customer_details(customer_id,customer_name,country)VALUES (:new.customer_id, :new.customer_name, :new.country);INSERT INTO projects_details (project_id, project_name, project_start_Date, customer_id)VALUES (:new.project_id,:new.project_name,:new.project_start_Date,:new.customer_id);EXCEPTIONWHEN duplicate_info THENRAISE_APPLICATION_ERROR (num=> -20107,msg=> 'Duplicate customer or project id');END trg_cust_proj_view_insert;
1.5再次插入视图。 INSTEAD OF
触发器将被触发并将数据插入到实际表中。
INSERT INTO customer_projects_view VALUES (1,'XYZ Enterprise','Japan',101,'Library management',sysdate);INSERT INTO customer_projects_view VALUES (2,'ABC Infotech','India',202,'HR management',sysdate);
1.6选择表格。
SELECT * FROM customer_details;
客户ID | 顾客姓名 | 国家 |
---|---|---|
1个 | XYZ企业 | 日本 |
2 | 美国广播公司 | 印度 |
SELECT * FROM projects_details;
PROJECT_ID | 项目名称 | PROJECT_START_DATE | 客户ID |
---|---|---|---|
101 | 图书馆管理 | 2017年6月25日 | 1个 |
202 | 人力资源管理 | 2017年6月25日 | 2 |
1.7选择视图。
SELECT * FROM customer_projects_view;
客户ID | 顾客姓名 | 国家 | PROJECT_ID | 项目名称 | PROJECT_START_DATE |
---|---|---|---|---|---|
1个 | XYZ企业 | 日本 | 101 | 图书馆管理 | 2017年6月25日 |
2 | 美国广播公司 | 印度 | 202 | 人力资源管理 | 2017年6月25日 |
2.嵌套表视图列
使用INSTEAD OF触发器将数据插入嵌套表视图列的示例。
2.1创建表,键入,嵌套表视图列进行测试。
CREATE TABLE vehicle_mfg_company_details (company_id number(10) primary key,company_name varchar2(50) NOT NULL
);
CREATE TABLE vehicle_details (vehicle_id number(10) primary key,company_id number(10) references vehicle_mfg_company_details(company_id),vehicle_model_name varchar2(50) NOT NULL
);
CREATE OR REPLACE TYPE nestedTableEle
IS
OBJECT (vehicle_id NUMBER(10),vehicle_model_name VARCHAR2(50));
-- nested table view column
CREATE OR REPLACE TYPE vehicle_details_list_ ISTABLE OF nestedTableEle;
2.2创建视图。
CREATE OR REPLACE VIEW company_vehicles_view ASSELECT company.company_id, company.company_name,CAST (MULTISET (SELECT vehicle.vehicle_id, vehicle.vehicle_model_nameFROM vehicle_details vehicleWHERE vehicle.company_id = company.company_id)AS vehicle_details_list_) vehiclelist
FROM vehicle_mfg_company_details company;
2.3将数据插入嵌套表视图列中。
-- no error.
INSERT INTO vehicle_mfg_company_details VALUES (101,'Ford');-- error
INSERT INTO TABLE (SELECT vw.vehiclelist FROM company_vehicles_view vwWHERE company_id = 101
)
VALUES (1, 'EcoSport');-- output
SQL Error: ORA-25015: cannot perform DML on this nested table view column
25015. 00000 - "cannot perform DML on this nested table view column"
*Cause: DML cannot be performed on a nested table view column except throughan INSTEAD OF trigger
*Action: Create an INSTEAD OF trigger over the nested table view columnand then perform the DML.
2.4创建INSTEAD OF触发器
CREATE OR REPLACE TRIGGER trg_comp_vehicles_view_insrtINSTEAD OF INSERT ON NESTED TABLE vehiclelist OF company_vehicles_viewREFERENCING NEW AS VehiclePARENT AS CompanyFOR EACH ROW
BEGIN-- Insert on nested table translates to insert on base table.INSERT INTO vehicle_details (vehicle_id,company_id,vehicle_model_name)VALUES (:Vehicle.vehicle_id,:Company.company_id,:Vehicle.vehicle_model_name);
END;
2.5再次将数据插入嵌套表视图列。
INSERT INTO TABLE (SELECT vw.vehiclelist FROM company_vehicles_view vwWHERE company_id = 101
)
VALUES (1, 'EcoSport');INSERT INTO TABLE (SELECT vw.vehiclelist FROM company_vehicles_view vwWHERE company_id = 101
)
VALUES (2, 'Endeavour');
2.6显示表。
select * from vehicle_mfg_company_details;
COMPANY_ID | 公司名 |
---|---|
101 | 福特汽车 |
select * from vehicle_details;
VEHICLE_ID | COMPANY_ID | VEHICLE_MODEL_NAME |
---|---|---|
1个 | 101 | 生态运动 |
2 | 101 | 奋斗 |
参考文献
- 代替OF触发器:-Oracle官方文档
- PL / SQL触发器:-Oracle官方文档
- Oracle PL / SQL – UPDATE触发器之前的示例
翻译自: https://mkyong.com/oracle/oracle-plsql-instead-of-trigger-example/
http://www.taodudu.cc/news/show-2357111.html
相关文章:
- Oracle Instead of Trigger的用法
- SQL : INSTEAD OF触发器的工作过程
- mysql instead of触发_mysql 触发器
- instead of 触发器的用法
- Instead Of 触发器
- 英语词组instead of的用法
- insteadof
- mysql instead of_mysql unique option prefix myisam_recover instead of myisam-recover-options的解决方法...
- php trait 冲突的解决 insteadof
- httpCient 的getResponseBodyAsStream instead is recommended使用方法
- Java instead of 用法_实例讲解instance of 运算符用法
- instead of 的用法
- mysql 触发器 instead of_AFTER触发器与INSTEAD OF触发器
- mysql instead of触发_在视图上使用 INSTEAD OF 触发器
- mysql 触发器 instead of_SQL Server Instead Of触发器
- 几种编辑器的区别
- 富文本编辑器 可全屏可粘贴(只能单独粘贴图片或文字)
- Guns二次开发(十四):集成 ueditor 富文本编辑器
- [android开源]简单富文本编辑器MRichEditor,图文混排算个啥
- 万年编辑器Vim
- DWZ 富文本编辑器 IE下失去焦点
- web前端的初学一周
- summernote 富文本编辑器上传七牛云服务器
- Unity 编辑器扩展教程
- vi 编辑器使用错误
- HTML:Marked-js+Bootstarp简单实现Markdown文本编辑器
- 福昕高级PDF编辑器Mac版PDF编辑器注册机激活下载版
- 富文本编辑器NicEdit的使用
- html5编辑器(图片编辑器基于canvas)
- 小程序解析富文本(支持视频,支持微信编辑器,支持135编辑器富文本样式)
Oracle PL / SQL – INSTEAD OF触发器示例相关推荐
- Oracle PL/SQL中的触发器
sql语句的执行一般都是一条一条的,当我们想执行了某一条sql语句时,会自动执行某些事件,这个时候就可以用到触发器.触发器顾名思义就是一件事的发生会被触发产生某一个事件. 创建了某触发 ...
- Oracle PL / SQL – UPDATE触发器之前的示例
本文向您展示了如何使用BEFORE UPDATE TRIGGER ,它在执行更新操作之前就可以使用. 在现实生活中,它主要用于以下目的: 资料验证 自动更新值 数据记录或审核 1.数据验证 假设一些公 ...
- oracle pl sql示例,oracle PL SQL学习案例(一)
oracle PL SQL学习案例(一) [示例1.1] 查询雇员编号为7788的雇员姓名和工资. 步骤1:用SCOTT/TIGER账户登录SQL*Plus. 步骤2:在输入区输入以下程序: /*这 ...
- ORACLE PL/SQL编程之八:把触发器说透
ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 8. ...
- Oracle PL/SQL实战
<Oracle PL/SQL实战> 基本信息 作者: (英)比林顿(Billington,A·)等著,卢涛 [作译者介绍] 出版社:人民邮电出版社 ISBN:9787115294852 上 ...
- oracle pl/sql 程序设计 历史笔记整理
20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...
- Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- oracle存储过程多分支怎样写,如何从存储过程返回多行? (Oracle PL / SQL)
如何从存储过程返回多行? (Oracle PL / SQL) 我想用一个参数创建一个存储过程,该存储过程将根据参数返回不同的记录集. 这是怎么做的? 我可以从普通SQL中调用它吗? 5个解决方案 65 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...
[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...
最新文章
- hdoj1175 连连看(dfs+剪枝)
- Java实现算法导论中有限自动机字符串匹配算法
- 数据结构_队列_mindmap
- XCTF WEB backup
- 小游戏掉帧卡顿启动慢运行内存不足……这些问题有解吗?
- php 各种进制表示,php各种进制的转换
- 解决java compiler level does not match the version of the inst
- 重磅汇总!2015-2019学硕国家线走势情况!
- asp.net 文件路径
- java洗扑克牌算法分析_IT兄弟连 Java语法教程 综合案例
- echarts时间轴传什么格式_职场必看,使用Excel实现大事件时间轴的做法,不看后悔...
- NLP --- 文本分类(基于LDA的隐语意分析训练算法详解)
- 数学公式编辑器AxMath
- java 菜刀_Java中国菜刀(Cknife)的模拟终端乱码解决方法 | 【韩涛博客】
- 台式电脑怎么组装步骤_详细教您台式电脑如何快速组装
- C语言分支/顺序作业总结
- 正则表达式从入门到摸鱼(本文内容过长,先给阿姨来一杯卡布奇诺再阅读)
- 触摸屏分屏拓展屏软件(可自定义界面)
- 统计学中假设检验有关P值的讨论
- 信息增益、信息增益率、Gini