核心思路就是:在第一次插入时保存值到包变量中,第二次插入时不再读取表本身,转而读取包变量,可以成功解决这类难题。
在工作中,需要为各个BOM的每个ITEM依次自动编号,不同BOM的ITEM的SEQ_NUMBER列都要 按1.2.3…自动生成序号。
第一次,我这样写,
CREATE OR REPLACE TRIGGER TR_BOM_AUTONUMBER_SEQNUMBER
BEFORE
INSERTON BOM
REFERENCING NEW
AS NEW OLD
AS OLD
FOR EACH ROW
DECLARE tmpVar
number;
BEGIN tmpVar :
= 0;
SELECT GREATEST(nvl(
Max(to_number(SEQ_NUMBER)),
0),
Count(
*))
+ 1 INTO tmpVar
FROM BOM
Where BOMID
=:New.BOMID;
:NEW. SEQ_NUMBER:
= nvl(tmpVar,
1);
END TR_BOM_AUTONUMBER_SEQNUMBER;
由于Insert操作会修改表数据,所以Insert…Select插入多行数据时,会报ORA-04091: table string.string is mutating, trigger/function may not see it错误,原因在于插入第2条数据时表已修改不能再访问。
查阅了很多文章,有提示在其中使用 PRAGMA AUTONOMOUS_TRANSACTION来保证每行插入动作为自治事务。但实际上,经过我的测试,虽然DML不会出错,但实际SEQ_NUMBER全部为1,没有达到依次自动编号的目的。
经过多次试验后,我使用保存于包中的索引表保存各个BOM的最大SEQ_NUMBER,可以防止BOM之间及用户之间的并发冲突。
核心思路就是:在第一次插入时保存值到包变量中,第二次插入时不再读取表本身,转而读取包变量,可以成功解决这类难题。
详细代码如下:
CREATE OR REPLACE PACKAGE BOM_AUTONUMBER
ISTYPE t_MAX_SEQNUMBER
is table of number INDEX BY PLS_INTEGER;
v_MAX_SEQNUMBER t_MAX_SEQNUMBER;
end BOM_AUTONUMBER;
/
CREATE OR REPLACE TRIGGER TR_BOM_AUTONUMBER_SEQNUMBER
BEFORE
INSERTON BOM
REFERENCING NEW
AS NEW OLD
AS OLD
FOR EACH ROW
DECLARE vNumber
number;
vBOMID
number;
BEGIN vNumber:
= 0;
vBOMID:
= :New.BOMID;
if not BOM_AUTONUMBER.v_MAX_SEQNUMBER.
EXISTS(vBOMID)
then SELECT GREATEST(nvl(
Max(to_number(SEQ_NUMBER)),
0),
Count(
*))
INTO vNumber
FROM BOM
Where ITEM
= vBOMID;
BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID) :
= nvl(vNumber,
0);
end if;
BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID) :
= BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID)
+ 1;
:NEW.SEQ_NUMBER :
= BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID);
END TR_BOM_ AUTONUMBER_SEQNUMBER;
/
分享到:
相关推荐
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法
使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查。使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查 使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查
oracle数据库ora-01152和ora-01110的解决办法
Drop goldengate用户时,报ORA-00604 ORA-20782 ORA-06512错误
离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法,在解决ORA-01033的过程中,又出现ORA-01145 * 第 1 行出现错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 接着的解决步骤
ORA-12541 TNSno listener 的解决方案 ORA-12541 TNSno listener 的解决方案
oracle网络配置(listener_ora-sqlnet_ora-tnsnames_ora).mht
如何解决ORACLE11G里面ORA-24247 网络访问被访问控制列表 (ACL) 拒绝 错误,获取ORACLE 11G(10g 以前没事)主机IP和实例名的时候,出现的错误
oracle启动失败,ORA-00702报错,windows,linux系统下解决办法
解决ORA-01033 ORACLE 正在初始化或关闭
创建物化视图ORA-12014错误解决方法 创建物化视图ORA-12014错误解决方法
-- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... -- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... -- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... ...
ORACLE ORA-00132 ORA-00214
ora-01033:oracle initialization or shutdown in progress 解决方法 ora-01033:oracle initialization or shutdown in progress 解决方法 ora-01033:oracle initialization or shutdown in progress 解决方法 ora-...
客户端进行连接的时候,系统不定期出现ora-12520,ora-12516的连接问题, 问题解决方案建议: 1、增加process和session的连接数。 2、检查连接的应用,是不是有没有释放的连接。 3、将修改参数local_listener中的vip为...
在运行查询SELECT * FROM V$SESSION 会出现ORA-29275:部分多字节字符的错误,这是什么原因开始我不得其解,网上也没有介绍什么好办法。本文给出答案。
错误描述:oracle远程连接服务器出现 ORA-12170 TNS:连接超时 错误检查:有很多是oracle自身安装的问题,但是我这里服务器配置正常,监听正常,服务正常,远程可以ping通服务器。 这里主要是防火墙问题,解决办法: ...
用oracle数据库新建连接时遇到ora-12505,此问题解决后又出现ora-12519错误,郁闷的半天,经过一番折腾问题解决,下面小编把我的两种解决方案分享给大家,仅供参考。 解决方案一: 今天工作时在新建连接的时候遇到...
ora-01720 授权选项对于'xxxx'不存在的解决方法,希望有帮助。