Oracle Instead of Trigger的用法
Oracle Instead of Trigger的用法
1. instead of trigger 是基于视图建立的,不能建在表上,为什么要建在视图上,一般的视图如果其数据来源一个表并且包含该表的主键,就可以对视图进行DML操作.另外一种情况是从多个表查询出来的.这样我们就不能对视图进行操作了,也就是只能查询.instead of trigger可以解决建在多表上视图的更新操作.
2.下面我们就来实例操作:
a.先建表,简单点就三个分别是学生表,课程表,学生选课表
CREATE TABLE STUDENT
(
CODE VARCHAR2(5),
LNAME VARCHAR2(200)
)
CREATE TABLE COURSE
(
CODE VARCHAR2(5),
CNAME VARCHAR2(30)
)
CREATE TABLE ST_CR
(
STUDENT VARCHAR2(5),
COURSE VARCHAR2(5),
GRADE NUMBER
)
--表的约束
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT$PK PRIMARY KEY(CODE);
ALTER TABLE COURSE ADD CONSTRAINT COURSE$PK PRIMARY KEY(CODE);
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$PK PRIMARY KEY(STUDENT, COURSE);
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$STUDENT FOREIGN KEY(STUDENT) REFERENCES STUDENT(CODE);
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$COURSE FOREIGN KEY(COURSE) REFERENCES COURSE(CODE);
b.基于这三个表的视图
CREATE OR REPLACE VIEW STUDENT_STATUS AS
SELECT S.CODE S_CODE, S.LNAME STUDENT, C.CODE C_CODE, C.CNAME COURSE, SC.GRADE GRADE
FROM STUDENT S, COURSE C, ST_CR SC
WHERE S.CODE = SC.STUDENT
AND C.CODE = SC.COURSE
c.基于视图的触发器
CREATE OR REPLACE TRIGGER TRI_STCR INSTEAD OF INSERT ON STUDENT_STATUS
FOR EACH ROW
DECLARE
W_ACTION VARCHAR2(1);
BEGIN
IF INSERTING THEN
W_ACTION := 'I';
ELSE
RAISE PROGRAM_ERROR;
END IF;
INSERT INTO STUDENT(CODE, LNAME) VALUES(:NEW.S_CODE,:NEW.STUDENT);
INSERT INTO COURSE(CODE, CNAME) VALUES(:NEW.C_CODE, :NEW.COURSE);
INSERT INTO ST_CR(STUDENT, COURSE, GRADE)
VALUES(:NEW.S_CODE, :NEW.C_CODE, :NEW.GRADE);
END;
d.对视图执行数据插入
INSERT INTO STUDENT_STATUS(S_CODE, STUDENT, C_CODE, COURSE, GRADE)
VALUES('001','Mike','EN','English',86);
可以看到每个表各有一条数据已经插入.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9606200/viewspace-745691/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9606200/viewspace-745691/
Oracle Instead of Trigger的用法相关推荐
- oracle 数据库 触发器 trigger 语法
http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...
- oracle中的merge into用法解析
oracle中的merge into用法解析 merge into的形式 MERGE INTO [target-table] A USING [source-table sql] B ON([cond ...
- oracle中over()分析函数的用法
摘自: http://www.poluoluo.com/jzxy/201004/81921.html 百度文库也记载了oracle中over()分析函数的用法 在泡坛子的时候中无意中发现了这个函数,才 ...
- oracle中的to_number,Oracle中to_number()函数的用法
to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...
- Oracle中to_char()函数的用法
Oracle中to_char()函数的用法 日期转换: to_char(date,'格式') select to_date('2005-01-01 ','yyyy-MM-dd') from dual; ...
- oracle的substr函数的用法
oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串 substr( string, start_position, [ length ] ) 如: subs ...
- oracle to_char函数格式,oracle 中to_char函数的用法
一.日期格式转换 to_char(date,'格式'); select to_date('2005-01-01 ','yyyy-MM-dd') from dual; select to_char(sy ...
- Oracle中add_months()函数的用法
Oracle中add_months()函数的用法 查询当前时间n个月以前的时间: select add_months(sysdate,-n) from dual; 查询当前时间n个月之后的时间: se ...
- bulk怎么使用oracle,oracle学习之bulk collect用法
通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...
- oracle中rollback用法,Oracle中SAVEPOINT和ROLLBACK用法
savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...
最新文章
- 免费报名 | 微软全双工语音对话以及在智能硬件上的应用
- springboot_4 spring boot 使用servlet,filter,listener和interceptor
- tomcat端口问题
- Java RMI 框架(远程方法调用)
- 如何快速搭建开放、多租户的电商云平台
- 抽象工厂模式(C#)
- S11 Linux系统管理命令
- 嵌入式系统开发之根文件系统
- 安装mysql-community-server报错缺少libaio依赖
- 题解 P2212 【[USACO14MAR]浇地Watering the Fields】
- 远程桌面 vs 虚拟桌面 vs 虚拟机区别
- 防火墙基础之路由器与防火墙单臂路由和DHCP接口地址池的配置
- 用CSS实现设置网页文字为只读,不可复制的方法
- Libra,一场赛博朋克噩梦!
- 实时网速显示_实例_python
- Apache Mina Demo
- KNN算法(二) sklearn KNN实践
- shell入门基础知识
- IIS的404页面乱码:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�的解决方法
- 最近调试HEVC中码率控制, 发现HM里面一个重大bug
热门文章
- Visual Studio Code——做嵌入式C/C++开发常用的编辑器软件安装及基本使用总结
- 文本信息过滤中的变体词识别(一)
- Java中 Tomcat 是干什么的?
- 师从施一公,4年8篇CNS,作为西湖大学博士后,她又以一作发了Science
- 全国各地网站备案的通过时间表
- 根2是无理数的几种证明方法
- html word 页面视图,word页面视图视图和web视图的区别
- 巨详细一文教你如何撰写商业计划书
- reset()方法 submit()方法
- MySQL gtid purge_MySQL中set gtid_purged的行为变更及对备份恢复的影响