繁体   English   中英

Oracle-将序列值设置为触发器内表的最大同一性值

[英]Oracle - Set the sequence value to max indentity value of the table within trigger

我需要从表中获取最大缩进值并将序列设置为该值。

为此,我试图从该触发器内的表(在其上触发了当前触发器的表)中读取最大同一性值,并将序列设置为该值,但是我要在读取表时发生变异错误。 我正在使用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;

以下是我的答案,对此我强烈反对:

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
            EXECUTE IMMEDIATE ('DROP SEQUENCE StringText_STxtID_SEQ');
            EXECUTE IMMEDIATE ('CREATE SEQUENCE StringText_STxtID_SEQ START WITH '||to_char(v_newVal));
        END IF;

        -- assign the value from the sequence to emulate the identity column
        :new.STxtID := v_newVal;
    END IF;
END;
/

序列是数据库对象。 您无法重置它们,必须删除并重新创建它们。 因此,您必须(ab)为此任务使用动态SQL。

这不是创建自动生成的连续整数主键列值的最佳实践。 此外,请考虑禁止手动输入此列,因为这些输入肯定会按照您尝试维护的顺序造成混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM