【发布时间】:2014-10-30 03:15:15
【问题描述】:
我需要从表中获取最大标识值并将序列设置为该值。
为此,我试图从该触发器中的表(触发当前触发器)中读取最大标识值并将序列设置为该值 但是我在阅读表格时遇到了变异错误。我正在使用 Oracle 11g。
所以我的问题是有什么方法可以将序列值设置为该触发器内表的最大标识值?请指教。
这是我的触发器;
create or replace
TRIGGER StringTextTrg BEFORE INSERT ON StringText
FOR EACH ROW
DECLARE
v_newVal NUMBER(12) := 0;
v_incval NUMBER(12) := 0;
BEGIN
IF INSERTING AND :new.STxtID IS NULL THEN
SELECT StringText_STxtID_SEQ.NEXTVAL INTO v_newVal FROM DUAL;
-- If this is the first time this table have been inserted into (sequence == 1)
IF v_newVal = 1 THEN
--get the max indentity value from the table
SELECT NVL(max(STxtID),0) INTO v_newVal FROM StringText;
v_newVal := v_newVal + 1;
--set the sequence to that value
LOOP
EXIT WHEN v_incval>=v_newVal;
SELECT StringText_STxtID_SEQ.nextval INTO v_incval FROM dual;
END LOOP;
END IF;
-- assign the value from the sequence to emulate the identity column
:new.STxtID := v_newVal;
END IF;
END;
【问题讨论】:
-
为什么要从触发器中执行此操作?如果您将代码从手动设置 ID 更改为从序列设置,那么在定义序列时使用正确的起始值是一项一次性任务?
-
@Alex - ID 是否可以通过代码手动设置。我只是想同时满足这两种情况。有什么建议吗?
-
您的
IF v_newVal = 1 THEN意味着它只会尝试检查最大值并调整序列是新的。我的建议是不允许这两种方法,这不是很有帮助,但会为您节省很多痛苦;但这与您所要求的不同,除非您允许手动值可能高于序列值(而不是填补空白,即使这通常也是一个坏主意)。 -
是的,亚历克斯,我认为最好的办法是不允许手动输入,我们不能同时满足两者。