【发布时间】: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