本文向您展示如何使用INSTEAD OF TRIGGER进行更新

  1. 非版本视图
  2. 非版本视图的嵌套表列

INSTEAD OF触发器提供了一种修改views的方法,该views无法直接通过DML语句(如INSERT,UPDATE和DELETE)进行修改

INSTEAD OF触发器是

  1. 始终是行级触发器。
  2. 可以读取旧值和新值,但不能更改它们。
  3. 不能是有条件的。 意味着我们不能添加WHEN或IF条件。

1.将数据插入视图

在此示例中,我们创建了一个INSTEAD OF触发器,当我们在视图上执行insert语句时,它将在view各个表中插入行。

1.1创建表。

customer_details
CREATE TABLE customer_details
(customer_id number(10) primary key,customer_name varchar2(20),country varchar2(20)
);
projects_details
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视图以获取客户及其项目的结果。

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触发器以执行实际操作。

trg_cust_proj_view_insert
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创建表,键入,嵌套表视图列进行测试。

vehicle_mfg_company_details
CREATE TABLE vehicle_mfg_company_details (company_id number(10) primary key,company_name varchar2(50) NOT NULL
);
vehicle_details
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
);
nestedTableEle
CREATE OR REPLACE TYPE nestedTableEle
IS
OBJECT (vehicle_id NUMBER(10),vehicle_model_name VARCHAR2(50));
vehicle_details_list_
-- nested table view column
CREATE OR REPLACE TYPE vehicle_details_list_ ISTABLE OF nestedTableEle;

2.2创建视图。

company_vehicles_view
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触发器

trg_comp_vehicles_view_insrt
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 奋斗

参考文献

  1. 代替OF触发器:-Oracle官方文档
  2. PL / SQL触发器:-Oracle官方文档
  3. Oracle PL / SQL – UPDATE触发器之前的示例
标记: 代替 oracle plsql 触发器 视图

翻译自: 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触发器示例相关推荐

  1. Oracle PL/SQL中的触发器

    sql语句的执行一般都是一条一条的,当我们想执行了某一条sql语句时,会自动执行某些事件,这个时候就可以用到触发器.触发器顾名思义就是一件事的发生会被触发产生某一个事件.         创建了某触发 ...

  2. Oracle PL / SQL – UPDATE触发器之前的示例

    本文向您展示了如何使用BEFORE UPDATE TRIGGER ,它在执行更新操作之前就可以使用. 在现实生活中,它主要用于以下目的: 资料验证 自动更新值 数据记录或审核 1.数据验证 假设一些公 ...

  3. oracle pl sql示例,oracle PL SQL学习案例(一)

    oracle PL SQL学习案例(一) [示例1.1]  查询雇员编号为7788的雇员姓名和工资. 步骤1:用SCOTT/TIGER账户登录SQL*Plus. 步骤2:在输入区输入以下程序: /*这 ...

  4. ORACLE PL/SQL编程之八:把触发器说透

    ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 8. ...

  5. Oracle PL/SQL实战

    <Oracle PL/SQL实战> 基本信息 作者: (英)比林顿(Billington,A·)等著,卢涛 [作译者介绍] 出版社:人民邮电出版社 ISBN:9787115294852 上 ...

  6. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  7. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  8. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  9. oracle存储过程多分支怎样写,如何从存储过程返回多行? (Oracle PL / SQL)

    如何从存储过程返回多行? (Oracle PL / SQL) 我想用一个参数创建一个存储过程,该存储过程将根据参数返回不同的记录集. 这是怎么做的? 我可以从普通SQL中调用它吗? 5个解决方案 65 ...

  10. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

最新文章

  1. hdoj1175 连连看(dfs+剪枝)
  2. Java实现算法导论中有限自动机字符串匹配算法
  3. 数据结构_队列_mindmap
  4. XCTF WEB backup
  5. 小游戏掉帧卡顿启动慢运行内存不足……这些问题有解吗?
  6. php 各种进制表示,php各种进制的转换
  7. 解决java compiler level does not match the version of the inst
  8. 重磅汇总!2015-2019学硕国家线走势情况!
  9. asp.net 文件路径
  10. java洗扑克牌算法分析_IT兄弟连 Java语法教程 综合案例
  11. echarts时间轴传什么格式_职场必看,使用Excel实现大事件时间轴的做法,不看后悔...
  12. NLP --- 文本分类(基于LDA的隐语意分析训练算法详解)
  13. 数学公式编辑器AxMath
  14. java 菜刀_Java中国菜刀(Cknife)的模拟终端乱码解决方法 | 【韩涛博客】
  15. 台式电脑怎么组装步骤_详细教您台式电脑如何快速组装
  16. C语言分支/顺序作业总结
  17. 正则表达式从入门到摸鱼(本文内容过长,先给阿姨来一杯卡布奇诺再阅读)
  18. 触摸屏分屏拓展屏软件(可自定义界面)
  19. 统计学中假设检验有关P值的讨论
  20. 信息增益、信息增益率、Gini

热门文章

  1. Java(实验四)Java标准类库-将一个字符串中的小写字母变成大写字母,并将大写字母变成小写字母
  2. 平肝息风药题库【1】
  3. 桌面改成d盘如何改回去 修改注册表可以如何生效
  4. SSO单点登录基本概念实现思路以及小的实例详解
  5. 挑筋(挑治)疗法——针挑治疗痔疮
  6. aws80端口不能访问的问题
  7. 抖音最火的微信推送教程
  8. php使用cookie获取浏览记录,php使用cookie存库浏览记录详解
  9. win10如何局部截图
  10. 躺在床上刷抖音,不如来写第一个 GO 程序入门篇