如何在SQL查询中处理错误和sequence.nextval?

时间:2013-11-08 16:37:54

标签: sql oracle sequence

我有一个web jsp应用程序和一个数据库。我想知道如何正确处理序列和插入。例如,我有一个预订表,列FLIGHT_ID, PASSPORT_ID。这对是独一无二的。现在,当我想从我在网站上收到的数据中插入新的预订时,我就是这样做的:

  1. 解析传入数据
  2. 从序列(BOOKING_ID
  3. 中获取新的SELECT SEQ.nextval FROM dual;
  4. 创建INSERT ...(new_booking_id,...)查询
  5. 查找Oracle DBMS抛出的异常(最常见的是唯一约束违规
  6. 这样可以正常工作,但我“丢失”序列的一些值,因为我在调用select时收到它们,但我不使用它们。

    每当我发现异常时,可能会使序列退一步:

    ALTER SEQUENCE SEQ INCREMENT BY -1;
    SELECT SEQ.NEXTVAL FROM DUAL;
    ALTER SEQUENCE SEQ INCREMENT BY 1;
    

    但这似乎不是最佳方式。是什么?

1 个答案:

答案 0 :(得分:0)

如果只关注丢失某些序列值,则只能在执行INSERT之前通过检查生成一次。从同一个表执行select并仅为要成功插入的记录生成newbookingID。 (正如您所提到的,异常可能是由于Unique约束,因此您已经知道哪些值应该是唯一的)