【问题标题】:Oracle Sequence TriggerOracle 序列触发器
【发布时间】:2015-03-04 06:28:27
【问题描述】:

我对 Oracle 不太熟悉,但我已经为我的应用程序编写了一个触发器,以使用序列为记录生成编号。我遇到的问题是,这些号码可能已经在使用中,我想添加一个检查以确保该号码是否已被使用,以从序列中选择下一个可用的号码。可以先完成这项工作吗?如果可以,我们将不胜感激?

DROP TRIGGER COMPLAIN_TRG_ENQUIRYNO;
CREATE OR REPLACE TRIGGER COMPLAIN_TRG_ENQUIRYNO
BEFORE INSERT
ON COMPLAIN REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
   l_enquiry_no_end    complain.enquiry_no_end%TYPE;
BEGIN    
    SELECT seq_enquiryno.NEXTVAL INTO l_enquiry_no_end FROM   dual;  
    IF :NEW.ENQUIRY_NO_END = ' ' THEN
        :NEW.ENQUIRY_NO_END := l_enquiry_no_end;
    END IF;     
EXCEPTION
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END ;

【问题讨论】:

  • 您不应该真正将序列中自动分配的 ID 与手动分配的 ID 混合在一起。如果您有手动分配的现有记录并希望为所有新记录开始自动分配,您可以将序列开始于高于所有现有值的位置,这样就不会有重叠。 (除非您打算处理它,否则您也不应该捕获异常;只是重新提出它会隐藏问题的原始位置)。
  • 感谢亚历克斯的回复和帮助!这些数字不被用作 ID,而只是作为客户参考号。您是否仍然建议不要混合并从更高​​的数字范围开始?
  • 如果您混合使用,则手动和自动设置都必须处理冲突。只有一种机制更简单。
  • 我会从较高的范围开始,但也要尽量确保不再有手动输入的数字。
  • 感谢百万人! :D

标签: oracle plsql triggers sequence


【解决方案1】:

如果列中有现有(数字)数据,请勿使用序列,因为这会导致重复。要么从空开始并使用序列,要么如果你真的被卡住了,找到你拥有的最大 pk 并重置序列的 startswith 属性。

或者,您可以使用 guid 代替具有始终全局唯一优势的 guid - 在触发器中调用 sys_guid() 函数。但是,它们可能会导致索引等其他问题。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 2014-10-28
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2013-02-09
    • 2010-11-28
    • 2017-07-19
    相关资源
    最近更新 更多