pl / sql触发器改变序列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pl / sql触发器改变序列相关的知识,希望对你有一定的参考价值。
我是pl / sql的新手。我正在尝试像这样的触发器(adr =删除行之后),但似乎我不能使用ALTER SEQUENCE。这是删除行之后递减的正确方法还是我应该使用过程?
CREATE OR REPLACE TRIGGER adr_trg
AFTER DELETE ON table
FOR EACH ROW
BEGIN
ALTER SEQUENCE table_seq INCREMENT BY -1;
END;
编辑:
我正在使用的序列:
CREATE SEQUENCE table_seq INCREMENT BY 1 START WITH 1;
触发我正在使用:
CREATE OR REPLACE TRIGGER bir_trg
BEFORE INSERT ON table
FOR EACH ROW
BEGIN
IF :new.id IS NULL
THEN
:new.id := table_seq.nextval;
END IF;
END bir_trg;
答案
我可能在这里“阅读各行”,但我怀疑你的目标是,如果你在sequence.nextval填充的表中有5个条目,例如
ID
---
1
2
3
4
5
然后有人删除第5行,您希望将序列恢复为值4。
这有两个问题:
- 如果有人删除“3”怎么办?您不能将序列回滚2,因为当您使用seq = 3并移至seq = 4时,您将发生冲突
- 您不能保证序列没有间隙。所有需要的是有人获取序列值,然后发出回滚(或在事务中遇到任何其他类型的错误,并且序列值永远消失)
这让我想到了最重要的问题:
你为什么还要担心差距呢?
另一答案
您不能在触发器中使用Alter语句。根据定义,触发器不能直接使用提交或回滚,“Alter”语句具有自动提交。如果您希望在触发器中使用提交或回滚,则可以使用“自治事务”块来实现此目的。
此外,您不需要使用触发器将序列nextval插入到列中,您可以在insert语句中直接使用seq_name.next_val。减少序列的值会导致数据不一致,例如在表中插入10行,序列的当前值为11.假设现在删除id = 2的行,并将序列值减少到10.On new insert it如果id列是PK,则会抛出错误,否则会创建id = 10的两行。
另一答案
首先,创建此功能:
SQL> create or replace function fn_inc_by_minus_one( i_sch_name varchar2, i_seq_name varchar2 ) return number is
v_seq_no number;
begin
execute immediate 'select '||i_sch_name||'.'||i_seq_name||'.nextval from dual' INTO v_seq_no;
execute immediate 'alter sequence '||i_sch_name||'.'||i_seq_name||' increment by -2 minvalue 0';
execute immediate 'select '||i_sch_name||'.'||i_seq_name||'.nextval from dual' INTO v_seq_no;
execute immediate 'alter sequence '||i_sch_name||'.'||i_seq_name||' increment by 1 minvalue 0';
return v_seq_no;
end;
/
无论何时你需要通过-1
增加你的序列,只需运行这个语句(不要像select jsao_super_cities_seq.nextval from dual;
那样破坏你的序列+1
增量的原始递增机制):
SQL> var n number;
SQL> exec :n:=fn_inc_by_minus_one('myschema','jsao_super_cities_seq');
/
以上是关于pl / sql触发器改变序列的主要内容,如果未能解决你的问题,请参考以下文章