Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle序列触发器_Oracle_Plsql_Triggers_Sequence - Fatal编程技术网

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

我对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 ;

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


或者,您可以使用guid而不是具有全局唯一性优势的guid—在触发器中调用sys\u guid()函数。但是,它们可能会导致索引等方面的其他问题。

您不应该将序列中自动分配的ID与手动分配的ID混合使用。如果您有手动分配的现有记录,并且希望为所有新记录启动自动分配,则可以启动高于所有现有值的序列,这样就不会有重叠。(除非您计划处理异常,否则您也不应该捕获异常;只需重新引发它就会隐藏问题的原始位置)。感谢您的回复和帮助!这些号码不被用作ID,而只是用作客户参考号。您是否仍然建议不要混合并从更高的数字范围开始?如果混合,则手动和自动设置都必须处理冲突。只有一种机制更简单。我会从更高的范围开始,但也会尝试确保不再有任何手动输入的数字。谢谢大家!:D