oracle触发器的相关问题,请教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle触发器的相关问题,请教相关的知识,希望对你有一定的参考价值。

CREATE OR REPLACE TRIGGER MQ_1116.MCB_TRIGGER
BEFORE INSERT OR UPDATE
OF METAGE_BILL_STATE
ON MQ_1116.METAGE_COMMISSION_BILL
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
tmpVar NUMBER;
l_chkno MATERIEL_RECEIVE_BILL.CHKNO%type;
BEGIN
tmpVar := 0;
select a.chkno into l_chkno from materiel_receive_bill a ,metage_commission_bill b
where B.BUSINESS_ID=A.BUSINESS_ID and B.METAGE_BILL_CODE=:new.METAGE_BILL_CODE;
if :new.METAGE_BILL_STATE='5' and :new.METAGE_BILL_TYPE='3' and :new.METAGE_DIRECTION='1' then
dbms_output.put_line(:OLD.METAGE_BILL_CODE );
delete from TESTPRODUCT_OUT_BILL where MQPARAMETER=:old.METAGE_BILL_CODE and MQDATE='Guidaoheng';
insert into TESTPRODUCT_OUT_BILL (mqdate,mqparameter,chkno)
values (:NEW.METAGE_BILL_CODE,'Guidaoheng',l_chkno);
end if;
if :new.METAGE_BILL_STATE='5' and :new.METAGE_DIRECTION='1' then
delete from TESTPRODUCT_OUT_BILL where MQPARAMETER=:old.METAGE_BILL_CODE and MQDATE='BangDanFaSong';
insert into TESTPRODUCT_OUT_BILL (mqdate,mqparameter,chkno)
values (:NEW.METAGE_BILL_CODE,'BangDanFaSong',l_chkno);
end if;
END MCB_TRIGGER;

我编译的时候没有问题,但是在我执行update的时候报错:ORA-04091: 表 MQ_1116.METAGE_COMMISSION_BILL 发生了变化,触发器/函数不能读
ORA-06512: 在"MQ_1116.MCB_TRIGGER", line 9
ORA-04088: 触发器 'MQ_1116.MCB_TRIGGER' 执行过程中出错。
请帮忙看看谢谢

参考技术A select a.chkno into l_chkno from materiel_receive_bill a ,metage_commission_bill b
where B.BUSINESS_ID=A.BUSINESS_ID and B.METAGE_BILL_CODE=:new.METAGE_BILL_CODE;
这一句在这种行级触发器中无法执行。可以把你的整个程序体写成一个存储过程,这个:new.METAGE_BILL_CODE作为该过程的一个参数传入,然后在触发器中调用这个存储过程即可。追问

哪还有别的方面嘛,只利用触发器来操作的

参考技术B DECLARE
tmpVar NUMBER;
l_chkno MATERIEL_RECEIVE_BILL.CHKNO%type;
PRAGMA AUTONOMOUS_TRANSACTION; ----增加这句代码试试,使用oracle自治事务
BEGIN本回答被提问者采纳

请教个实际问题,C# serialPort在读取数据有时候会连续触发DataReceived事件

我把波特率设置为115200;我传数据长度500字节到1000字节(理想是1200字节),我想在serialPort读取一次就把数据读完,但是实际情况中会触发2次DataReceived事件 。假如传总字节是500,情况一:第一次触发DataReceived事件 就会把500字节的数据全部读完,第二次触发DataReceived事件 得到的数据长度为0,我是用sp.BytesToRead判断的;情况二:第一次触发DataReceived事件为499,第二次触发DataReceived事件的数据长度为1了;问题是怎么设置可以避免情况二,希望是读取一次就把500字节读完,请大家帮帮忙啊!

设置serialPort的某一属性,使缓存达字节到设置值,才触发DataReceived事件追问

我 的属性是这样的,其中readbuffersize和writebuffersize开始默认值和我后面设置的值还是存在我上面的情况,请帮忙看下 谢谢

追答

ReceiveBytesThreshol改为500

追问

谢谢你的回答,我刚刚去测试了下,这个属性我理解为没有达到这个设定值的话就不会执行DataReceived事件,但是我读取的数据也有可能低于500,同时也不排除只有一个字节的时候。所以这个属性无法满足要求,请问还有没有其他的方法啊

参考技术A 没有碰到你说的情况,是不是你设置的有问题?

把代码贴出来看看吧追问

上面是我的代码,我用一个移动设备,可以理解成扫描枪,触发这个事件后,扫描一次会弹出2次MessageBox.Show,就是我问题描述的情况了,请帮忙看下 谢谢

追答

你串口读入的是16进制数据吗?

还有你的接收缓存区,为什么要设置成动态的?

追问

sp.BytesToRead是获取串口byte数据的总长度,当然得到的数据就是byte[],所以我问题表述中出现情况二,那么得到的数组就会少一个字节,得到不完整的数据,重点是为什么会扫描一次会弹出2次MessageBox.Show,请问有没有这方面类似的情况啊或者说解决方法的

追答

你怎么就没有明白我的意思??
要是十六进制数据,采用数组的形式接收;
如果接收的是字符串,采用string的方式接收;
还有接收缓冲区,直接设置一个固定值,不要去动态的随着接收长度去分配。
你出现的问题,肯定和我上面提到的有关系,明白???

追问

谢谢你的回答,我的数据是16进制的,而我用byte[] 来接受它,关于你说的接受缓冲区是设置固定值,我确实没有理解到是什么意思,请问指动态值是指byte[sp.BytesToRead]这句吗?

追答你这样试试吧,满意请采纳
  byte[] buffer = new Byte[2048];                  //创建缓冲区 
  int a1 = serialPort1.BytesToRead;
  serialPort1.Read(buffer, 0, serialPort1.BytesToRead);
  buffer[a1] = (Byte)'\\0';

本回答被提问者采纳

以上是关于oracle触发器的相关问题,请教的主要内容,如果未能解决你的问题,请参考以下文章

oracle 创建触发器问题

Oracle 触发器调试及遇到相关问题解决

Oracle-触发器

尝试创建我的第一个 oracle 触发器时出现问题

Oracle 触发器

oracle 触发器学习