ORACLE触发器如何向客户端抛出自定义错误,同时写表记录该事件?

ORACLE建立一个触发器,记录pat_visit 表的某字段被修改的情况,写入tmp_msg表。
记录部分是正常工作的,直到后来为了向客户端抛出错误提示“非法操作,护士……”增加了后面的raise_application_error那一大段。
如果抛出自定义异常的话,前面的记录操作也一同失效,即使是加了commit也不管用。
如何能够即抛出自定义异常同时又能修改(其他表)记录呢?

create or replace trigger TMP_REC_WHO_CHANGE_ADDEPT
  before update of dept_admission_to on pat_visit  
  for each row
--监视pat_visit入院科室改动
declare
  mymsg varchar(2000);
begin
  select ... into mymsg from v$session where audsid=sys_context('USERENV','SESSIONID');

  if :old.dept_admission_to <> :new.dept_admission_to then
    insert into tmp_msg(rec_creator,rec_msg) 
      values ('REC_WHO_CHANGE_ADDEPT',mymsg);
    commit; --如果下方向客户端抛出异常,提交也不起作用

    if upper(mymsg) like '%NURSE.EXE%' then
      if sysdate - nvl(:old.admission_date_time,sysdate) > 0.25 then
        raise_application_error('-20002', '非法操作,护士站尝试修改入院日期');
      end if;
    end if;
  end if;
end tmp_rec_who_change_ADDEPT;
liero1982
liero1982 看来只能用“自治事务”(pragma autonomous_transaction)来解决这个问题了,要建立两个触发事件/过程。基础触发事件用于抛出错误或回滚,自治事务用于记录日志。
7 个月之前 回复
liero1982
liero1982 貌似只要抛出错误,就等于把触发器所做的(非触发表的)update、insert等操作全废了
7 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Oracle触发器抛出自定义异常
现有学生表 student(sno int,sname varchar2(20)) 成绩表 score(sno int,cno varchar2(10),degree number) 给student编写一个触发器,当删除一个学生信息时将触发该触发器,判断该学生是否已经选课,如果该学生已经选课。将激发一个异常,把无法删除的信息返回给用户。 create or replace tr
如何同时向多个表插入记录
CREATE TABLE [dbo].[Table1] (rn [tab1] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,rn [id1] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL rn) ON [PRIMARY]rnGOrnCREATE TABLE [dbo].[Table2] (rn [tab2] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,rn [id2] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL rn) ON [PRIMARY]rnGOrnCREATE TABLE [dbo].[Table3] (rn [tab3] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,rn [id3] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL rn) ON [PRIMARY]rnGOrnrn三个表table1,2,3rn插入以下记录:rnid1=id2=id3=1rnid1=id2=id3=2rnid1=id2=id3=3rn...
JS抛出自定义错误
    本菜在学校中学习java语言时,老师曾教我们编写抛出错误语句,当时就十分不理解,‘错误明明是随时会产生的,为什么还要代码抛出?’至今未弄明白。     本质上当某些非期望的事情发生时程序就引发了一个错误。也许是给一个函数传递了一个不正确的值,或者是数学运算碰到了一个无效的操作数,或是出现了拼写错误的指令。编程语言定义了一组基本的规则,当偏离这些规则时将导致错误,然后由开发者修复代码。如...
同时插入,更新其它数据库.表的触发器该怎么写?
比如:rn服务器有数据库 rnERP.2007;rnERP.2008;rnERP.SamlpernMainERPrnrn它们都有一个数据表 WorkUser,并且字段类型都一致.rnrn我想当ERP.Main.WorkUser Insert/Update/Delete 数据时,同时也对这些数据库.WorkUser进行同步更新.rnrn已能获取数据库名:rn[code=SQL]Select Name FROM Master..SysDatabases Where Name Like 'ERP.%';[/code]rnrn但该怎么在触发器里对这些数据库.WorkUser进行更新呢?rn
写触发器向oracle添加记录怎样实现呢
由于需求,需要在添加或更新记录时同时向oracle添加或更新对应记录的数据,该怎样实现呢?
请问记录对某个表的删除操作的触发器该怎么写?
rn我有一个表,想记录下来客户端对它进行的操作(主要想记录删除操作),rn当客户端对表table1进行删除操作时,我想记录下来删除操作的SQL语句及操作时间写到table2中去rn这个触发器该怎么写呢?rn新手求教,请大家帮我,谢谢。
WPF,这个事件触发器该怎么写
rn rn rnrn [color=#FF00FF]//这里该怎么写,使Content变为"张三"[/color] rn rn rnrnrnrn问题:rn一个事件触发器,当鼠标移到Button上时,使Content属性变为"张三",普通的属性触发器就不用了,我指的是用事件触发器。
同时向一个表添加记录的问题??????????????????
我建了两个结构相同的表,A表和B表,A表是总表,B表是临时表,记录添加时先存在B表中,在B表保存后,再添加到A表(总表)中,现在出现一个问题,当两个人同时向B表中添加记录时,后一个人会把第一个人添加的记录冲掉,也就是说不能两个人同时向B表中添加记录,这个问题如何解决,请高人指点!
同时向表添加N条记录
假设数据库的表有5个文本字段,要一次向这个表里添加n条记录。 rnrn想在ASP页面上设计一个含5个文本控件的表单,前面加一个复选框,当需要增添记录时,就点一下复选框;然后将这n条记录,一次性提交给数据库。rn
当向一个表插入记录时,向另一个也插入该记录的触发器
1、如果第二个表已经有这个记录了,就不插入,如果没有,就插入这条记录 create or replace trigger fortest after insert on test1 for each row declare co number := 0; begin   select count(1) into co from test2 where a = :new.a and b
Javascript错误处理之抛出自定义错误
//抛出自定义异常    function divide1 (iNum1, iNum2) {        try{            if(arguments.length != 2) {                throw new Error(&quot;divide() requires two arguments.&quot;);            } else if (typeof(...
Python中自定义抛出错误
1. Python中自定义抛出错误# 定义一个 Exception 类 class AlreadyRegistered(Exception): pass # raise 抛出这个错误:Exception('info...') if model in self._registry: raise AlreadyRegistered('The model %s is already reg
触发器中能不能用raiseerror抛出自定义错误?
我在一个insert触发器中,使用raisererror抛出错误,但在pb程序中却抓不到我自己抛出的错误,只报出类似插入失败这样的错误,请问各位是不是在触发器中不能使用raseerror抛错的啊?
Oracle如何高效抛出ora-00001错误
今天吃饭排队的时候,脑子突然闪出一个念头。设想一下以下场景: 在一张大表,可能有上亿条数据,在表中建立了主键或者唯一索引。当有会话插入数据违反唯一性约束时,Oracle是如何快速判断这个值已存在,而抛出ora-00001错误呢? 从性能上来讲,Oracle不太可能将这些数据存放在shared_pool或者其他内存区域中,假如放在内存区域中,必须先解决两个问题: 1、如果有上千个唯一约束表格,...
如何同时安装Oracle客户端和Oracle服务器?
似乎二者的环境变量冲突啊,我试了试不论安装顺序如何,只要装了客户端,服务器就不正常了~ rnrn求解决方法!
Oracle触发器事件
1.说明1)触发器是一种特殊的存储过程,触发器一般由事件触发并且不能接受参数,存储器由语句块去调用2)触发器分类:1.DML触发器: 创建在表上,由DML事件引发2.instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)3...
oracle 触发器中使用dblink后抛出ORA-04052错误
代码如下,有省略 rnCREATE OR REPLACE TRIGGER tr_for_user AFTER INSERT OR DELETE ON masa_user rnrnDECLARE rnuser_sum NUMBER; rnrnBEGIN rn SELECT COUNT(t.USERNAME) rnrn INTO USER_SUM rn FROM (SELECT T.F_USERID USERNAME rn FROM MASA_USER T rn MINUS rn SELECT USERNAME USERNAME FROM tUserinfo@ABC) t; //ABC为一个dblink名称 rnrnEND; rnrn报错信息: rnError: PL/SQL: ORA-04052: error occurred when looking up remote object ICD.TUSERINFO@ICD.US.ORACLE.COM rn ORA-00604: error occurred at recursive SQL level 1 rn ORA-03106: fatal two-task communication protocol error rn ORA-02063: preceding line from ICD rnLine: 14 rnText: SELECT COUNT(t.USERNAME) rnrnError: PL/SQL: SQL Statement ignored rnLine: 14 rnText: SELECT COUNT(t.USERNAME) rnrn将其中select语句单独执行没问题,放到触发器中就不能通过报错了,抛出的三个oracle错误不知道如何解决
如何同时向两张相关的表中写入记录
我建了两张表,第一张表的主键是第二张表的外建,需要同时向两张表中写入数据,并将表一的自动增加的序号写入第二张表中,我该如何作,请高手指点
PB如何抛出错误?
在DateWindow控件中的代码如下:rnstring id1,id2rndw_1.Selectrow(0,false)rndw_1.selectrow(row,true)rnrnid1=dw_1.getitemstring(row,1)rnid2=dw_1.getitemstring(row,2)rn运行后,点击窗体最上方的标题栏,全选下方的全部数据栏,然后程序报错,内容如下:rnr0006rnInvalid DataWindow row/column specified at line 21 in clicked event of object dw_1 of zd_nrnrn用的是PB9rn请问可以将这个错误抛出吗,该怎么写?
如何向ORACLE表中添加字段并同时添加数据
在我建立的表中,已经有了若干行纪录,如何新添加一列字段,并且给这个字段添加相应的数据,求解啊
抛出事件
一个编译为dll的class1调com,并响应联结点事件rn另一个类(class2)refrence上面的dllrn现在想知道怎么让class2知道com连接点事件发生 要是能像抛出异常那样抛出事件多好rn
Java简化Oracle 存储过程,触发器抛出的异常信息
近期开发公司的平台项目,由于前期的数据库基础扎根比较深,很多功能操作都是在存储过程,触发器中进行控制。这些东西最恶心的地方就是返回的异常会出现超级大长串。需要在后台捕获异常进行判断,最终返回到前端。为了偷个懒,写了个简化异常的方法,去掉了后台的判断。直接可返回到前台。也给大家分享一下。 public String resultException(Exception e){ //传进来...
Oracle中向表中插入数据错误
[img=C:\Users\Administrator\Desktop\back\未命名.jpg][/img]rn第二条语句可以执行,为什么第一条语句就不能执行,我也检查了表结构,一点错误也没有。rn当我把那条语句单独拿出来放在命令窗口可以执行,为什么放在begin和end之间就不能执行了,求解
触发器同时操作几个表
现有一表A 里有字段 Id, CREATORID, SENDTIME, SENDLEVEL, RF_IDrn现有一表B 里有字段 Id CREATORID, SENDTIME, SENDLEVEL, SENDSTATE, Template_Id (有10W数据)rnrnrn要求实现:现在向表A插入数据同时更新B表rnrnrnrn两表的关系是:表A中的RF_ID字段里内容来自与表B中的Template_Id 也就是 B.Template_Id =A.RF_IDrnrnrnALTER TRIGGER [dbo].[Tri_Insert_Update_Net]rn ON Arn AFTER INSERTrnAS rnBEGINrn declare @CREATORID varchar(40),@SENDTIME datetime,@SENDLEVEL smallint,@RF_ID int rn select @CREATORID=CREATORID,rn @SENDTIME=SENDTIME,rn @SENDLEVEL=SENDLEVEL,rn @RF_ID=RF_ID rn from insertedrn update Brn set B.CREATORID=@CREATORID,rn B.SENDTIME=@SENDTIME,rn B.SENDLEVEL=@SENDLEVELrn where B.Template_Id=@RF_IDrnENDrnrnrnrn为何没有用呢
oracle触发器错误。表发生了变化,触发器不能读它
把触发器代码贴上,请问下以下写法哪里出的问题呢?rnrnCREATE OR REPLACE TRIGGER MAP_UPDATE_ALARMrn BEFORE UPDATE OF TS_ID,MAPPING_RULE ON FEATURE_MAPrn FOR EACH ROWrnrnDECLARErn V1 FEATURE_MAP.TS_ID%TYPE;rn V2 FEATURE_MAP.MAPPING_RULE%TYPE;rn V3 FEATURE_MAP.MAPPING_RULE%TYPE;rn PRO_NAME VARCHAR2(50);rnBEGINrn SELECT :OLD.TS_ID,:OLD.MAPPING_RULE,:NEW.MAPPING_RULErn INTO V1,V2,V3rn FROM FEATURE_MAP;rn rn SELECT B.OBJECT_NAME rn INTO PRO_NAMErn FROM TRANS_STEP A,USER_OBJECTS Brn WHERE A.OBJECT_ID=B.OBJECT_ID AND B.OBJECT_TYPE='PROCEDURE' AND A.TS_ID=V1;rn rn INSERT INTO MODI_METADATA_ALARM_INFOrn (before_update_info,after_update_info,to_be_modified_pro,modified_flag,update_time,update_user)rn VALUES(V2,V3,PRO_NAME,'是',SYSDATE,USER);rnrnEND;
PB求教-如何向该表内插入数据记录
别人建的表,我向该表内插入数据记录无反应,请给出插入代码:rnrn表名: details 表列名如下rn-----------------------------------------------------------------------rn字段 数据类型 是否为空 默认值rndetailsid int identity Not Nullrntitle nvarchar(300) Nullrnuserid int Null (0)rndtappenddate datetime Null Current_Timestamprnnum int Null rnadminid int Nullrnchrmark ntext Nullrnid int Null (0)rn
Oracle 触发器错误
报错 Ora-04091 table XXX is mutating ,trigger/function may not see it rnrnrn我的用法是,删除表 A 的时候触发删除 表 B的关联内容,删除表B的内容级联删除 表C 的关联内容 ,rnrn这个错就是直接删除A的记录的时候出现的rnrn不知道该如何处理,关键是并不是所有的情况都会报错,有时候也是正常的。或者Oracle 9.2 不支持这种触发器的做法。。rnrnrnCSDN 的高手们 请教了!!rn
触发器如何向远程数据库写值?求助!!!
我在本地数据库建一触发器,如何向远程数据库写值?rn我用如下代码不行:insert opendatasource('SQLOLEDB','Data Source=211.162.2.100; User ID=test; Password=test').UserInfo.dbo.Job select * from inserted 提示新事务不能登记到指定事务处理器,OLEDB提供程序SQLOLEDB无法启动分布式事务.但在局域网内两台SQL服务器之间是可以的,请高手帮忙,谢谢!!!rn
Oracle触发器错误
我想让Oracle数据库中的一个“产品表”的一个编号字段自动增长,rn所以我先建了一个序列 seq_production_idrn然后我在建触发器时出现了错误,触发器的SQL语句如下:rnCREATE OR REPLACE TRIGGER "SYSTEM"."TRI_PRODUCTTION_ID" BEFORErnINSERT ON "SYSTEM"."PRODUCTION" FOR EACH ROW rnbegin rnselect seq_production_id.nextval into :new.id form dual; rnend;rnrnOracle数据库报的错误为:rnSQL 错误 rnFailed to commit: ORA-06552: PL/SQL: Compilation unit analysis terminated ORA-06553: PLS-320: 此表达式的类型声明不完整或格式不正确 rn我实在是看不出错误在哪里,跪求大侠帮忙解决rn
Oracle 触发器错误。
rnSQL> CREATE OR REPLACE TRIGGER check_sscorern 2 BEFORE INSERT ON ssystem FOR EACH ROWrn 3 DECLARErn 4 score_out_exception EXCEPTION;rn 5 BEGINrn 6 IF(:new.Major1Score<60) OR (:new.Major2Score<60) OR (:new.Major3Score<60) OR (:new.TotalScore<6rn0) THENrn 7 INSERT INTO ssystem VALUES(:new.sid,:new.sname,:new.EnglishScore,:new.PoliticsScore,:new.Majorrn1Score,rn 8 :new.Major2Score,:new.Major3Score,:new.TotalScore,'F');rn 9 rn 10 ELSEIF (:new.Major1Score>100) THENrn 11 RAISE score_out_exception;rn 12 rn 13 ELSErn 14 INSERT INTO ssystem VALUES(:new.sid,:new.sname,:new.EnglishScore,:new.PoliticsScore,:new.Major1rnScore,rn 15 :new.Major2Score,:new.Major3Score,:new.TotalScore,'T');rn 16 rn 17 END IF;rn 18 EXCEPTIONrn 19 WHEN score_out_exception THENrn 20 dbms_put.out_line('err');rn 21 END;rn 22 /rnrn警告: 创建的触发器带有编译错误。rnrnSQL> show err;rnTRIGGER CHECK_SSCORE 出现错误:rnrnLINE/COL ERRORrn-------- -----------------------------------------------------------------rn8/31 PLS-00103: 出现符号 "THEN"在需要下列之一时:rn := . ( % ;rnrn16/1 PLS-00103: 出现符号 "EXCEPTION"在需要下列之一时:rn begin case declarern else elsif end exit for goto if loop mod null pragma raisern return select update while with rn <
oracle触发器错误
建了个触发器,什么功能都没有,还报错:触发器无效且未通过重新验证。rn触发器:rnCREATE OR REPLACE TRIGGER bifer_KJPZXX_PZBHLSrnBEFORE INSERT ON CF_KJPZXX_TMPrnFOR EACH ROWrnBEGINrnrnEND;rnrn难道还有什么权限限制吗?
如何同时向两张表插入记录
sql语句中很难写或者没有同时插入两张表的sql语句,解决办法是在xml里写两个insert  sql语句,执行两个插入方法: parameterClass="TB0005_SNIMDT"> insert into TB0005_SNIMDT(snpccd,fltp,flspun,flclpr,flcltm,flsc,brfl,rm,flnm)  values(#snpccd#,#f
oracle上写触发器
NULL 博文链接:https://javatea.iteye.com/blog/2071401
oracle 触发器 怎么写
我oracle一个字符串字段 changeno想填写入 IT2013001 IT2013002一直递增rn用触发器写了一个 没有拼接IT和2013 应该怎么写呢 下面的只能递增 数字序列 IT2013怎么接上呢?谢谢rnrn[code=sql]rncreate or replace trigger tri_changenorn before insert on changesrn for each rowrndeclarern nextid number;rn beginrn IF :new.changeno IS NULL or :new.changeno=0 THEN rn select seq_changeno.nextvalrn into nextidrn from sys.dual;rn :new.changeno:=nextid;rn end if;rnend tri_changeno;rnrn[/code]
写一个触发器(oracle)
create table t_temprn(rn id varchar2(10) primary key,rn len1 number(6,0),rn len2 number(6,0),rn len number(7,0)rn)rn当update某一行的len1或len2值后,则修改该行len的值(len = len1 + len2),rn或者insert 一条新的记录后,修改len = len1 + len2rn哪位帮我用触发器实现上面的功能rn
Transact_SQL快速参考
见附件
如何同时向两个表插入数据
[code=SQL]rn比如 insert tablern select 'a','b'rnrn 一次只能插入一个表,如何一次插入两个表呢rn[/code]
怎么样写ORACLE自定义函数返回表?
请教各位高人,我现在有这么个烦心事:rnrn有一个恶长恶长的SQL语句(真的很长),带了十多个参数,在PL/SQL里运行通过。rnrn问题是:rnrn我要在程序页面(ASP.NET)里来调用这个长的SQL语句的话,拼这么长SQL用字符串连接的话实在太麻烦了。。。。rnrn我是想:rnrn把这个超长的SQL语句写成一个ORACLE的自定义函数,并返回一个table,那么在程序里只要调用 "select * from F_函数" 不就可以了嘛?rnrn但是:rnrn小弟没写过返回table的自定义函数,请高手指点,并给出范例,多谢多谢!rnrn这个恶心的SQL貌似这样的:rn。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。rnrnrnrn
如何利用触发器精确定位表中的记录?
如何利用触发器精确定位表中新增、修改、删除的记录(找到该记录的主键)?
求教:WebService如何向Web客户端抛出自定义异常
放在WebService论坛一天了,还是没人能帮忙解决下,特来宝地借点人气。rnrn传送门:[url=http://topic.csdn.net/u/20101115/11/6c572315-6e26-49b1-a323-12d07cf99fa3.html][/url]
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法