设为首页 收藏本站
查看: 736|回复: 0

[经验分享] Oracle (替代触发器)

[复制链接]

尚未签到

发表于 2016-7-17 09:36:36 | 显示全部楼层 |阅读模式
create or replace trigger 名
instrad of delete from 视图
begin
执行输出
end;
比如你写删除后 触发器输出该提示后
例如:begin
dbms_output.put_line(:old.ename)
end;
这里写上这个提示后 如果执行 delete from v_emp2;的话  提示是提示 (但是实际不删除视图中内容)

如果你想真正删除表中内容的话
在begin里面执行真正的  delete 删除表中内容

  

DML触发器
create trigger 名
before|after   insert or update or delete on 表名
referencing old as o new as n
for each row
declare
--声明
begin
--执行
:new  :old
inserting updating  deleting
end 名;
替代触发器 只可以添加在视图上
create trigger 名
instead of   insert or update or delete on 表名
referencing old as o new as n
for each row
declare
--声明
begin
--执行
:new  :old
inserting updating  deleting
end 名;
drop table students cascade constraint;
create table students(
id int primary key,
name varchar2(20));
insert into students values(1001,'TOM');
insert into students values(1002,'CAT');
insert into students values(1003,'TOMCAT');
drop table s1;
create table s1(
sid int,
kid int,
score int,constraint fk_s1_sid foreign key(sid) references students(id));
insert into s1 values(1001,1,80);
insert into s1 values(1001,2,98);
insert into s1 values(1002,1,88);
drop table s2;
create table s2(
sid int,
kid int,
score int,constraint fk_s2_sid foreign key(sid) references students(id));
insert into s2 values(1002,2,68);
insert into s2 values(1003,1,100);
insert into s2 values(1003,2,45);

级联更新
1 查询到那些表和主表相关联
1查看当前主键约束的信息
select constraint_name,constraint_type,table_name
from user_constraints
where table_name='STUDENTS'
2 查看外键表
select table_name,constraint_name
from user_constraints
where r_constraint_name='SYS_C005161';
2 查看到表中相关联的字段
select column_name from user_cons_columns where constraint_name='FK_S1_SID';


create or replace trigger tri_students_update
after update on students
for each row
declare
v_update varchar2(2000);
begin
for r in (select table_name tname,constraint_name cname
from user_constraints
where r_constraint_name in (select constraint_name
from user_constraints
where table_name='STUDENTS') )
loop
for r2 in (select column_name  cname from user_cons_columns where constraint_name=r.cname)
loop
v_update:='update '||r.tname||' set '||r2.cname||'='||:new.id ||' where ' ||r2.cname||'='||:old.id;
dbms_output.put_line(v_update);
execute immediate v_update;
end loop;
end loop;
end;

========================================
execute immediate
=================包
1包头
create or replace package pck_test is
--函数
function userdate return varchar2 ;
--过程
procedure p_test;
end pck_test;
2包体
create or replace package body pck_test as
--函数实现
function userdate return varchar2 is
begin
return to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day');
end userdate;
--过程的实现
procedure p_test as
begin
dbms_output.put_line('procedure ......package.');
end p_test;
end pck_test;


==========================JAVA调用存储过程和函数
1 创建一个无参数的存储过程
创建EMP2空表 如果表不存在创建,存在则清空内容记录
create or replace procedure p1 is
begin
begin
execute immediate 'create table emp2 as select * from emp where 1<>1';
exception
when others then
null;
end;
execute immediate 'delete from emp2';
end p1;
2 创建一个带IN参数的存储过程
输入员工编号修改其员工工作为经理;
create or replace procedure p2(in_empno int) is
begin
update emp set job='MANAGER' where empno=in_empno;
end;
3 创建一个带OUT参数的存储过程
返回EMP表中一共有多少条记录
create or replace procedure p3(out_count out int) is
begin
select count(*) into out_count from emp;
end;
4 创建一个带IN和OUT参数的存储过程
输入部门编号删除部门员工返回删除数量
create or replace procedure p4(in_deptno in int,out_count out int) is
begin
delete from emp where deptno=in_deptno;
out_count:=sql%rowcount;
end;
5 创建一个存储过程返回一个结果集
输入起始行和终止行返回结果集
create or replace procedure p5(in_start int,in_stop int,out_cursor out sys_refcursor) is
begin
open out_cursor for
select * from (select rownum r,emp.* from emp) where r between in_start and in_stop;
end;
6 创建一个函数返回当前时间
输入一个自定义的格式 返回指定格式的时间
create or replace function p6(in_date_format varchar2) return varchar2 as
begin
return to_char(sysdate,in_date_format);
end;

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245179-1-1.html 上篇帖子: oracle 修改默认值 下篇帖子: Oracle Decode()函数使用技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表