Oracle序列触发器
我对Oracle不太熟悉,但我已经为我的应用程序编写了一个触发器,使用序列为记录生成编号。我的问题是,这些数字可能已经在使用中,我想添加一个检查,以确保该数字是否已经被使用,并从序列中选择下一个可用的数字。是否可以先这样做,如果可以,我们将非常感谢您的帮助Oracle序列触发器,oracle,plsql,triggers,sequence,Oracle,Plsql,Triggers,Sequence,我对Oracle不太熟悉,但我已经为我的应用程序编写了一个触发器,使用序列为记录生成编号。我的问题是,这些数字可能已经在使用中,我想添加一个检查,以确保该数字是否已经被使用,并从序列中选择下一个可用的数字。是否可以先这样做,如果可以,我们将非常感谢您的帮助 DROP TRIGGER COMPLAIN_TRG_ENQUIRYNO; CREATE OR REPLACE TRIGGER COMPLAIN_TRG_ENQUIRYNO BEFORE INSERT ON COMPLAIN REFERENCI
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 ;
如果列中存在(数字)数据,则不要使用序列,因为这可能导致重复。要么从空开始使用序列,要么如果你真的被卡住了,找到你拥有的最大pk并重置序列的startswith属性
或者,您可以使用guid而不是具有全局唯一性优势的guid—在触发器中调用sys\u guid()函数。但是,它们可能会导致索引等方面的其他问题。您不应该将序列中自动分配的ID与手动分配的ID混合使用。如果您有手动分配的现有记录,并且希望为所有新记录启动自动分配,则可以启动高于所有现有值的序列,这样就不会有重叠。(除非您计划处理异常,否则您也不应该捕获异常;只需重新引发它就会隐藏问题的原始位置)。感谢您的回复和帮助!这些号码不被用作ID,而只是用作客户参考号。您是否仍然建议不要混合并从更高的数字范围开始?如果混合,则手动和自动设置都必须处理冲突。只有一种机制更简单。我会从更高的范围开始,但也会尝试确保不再有任何手动输入的数字。谢谢大家!:D