自定义序列生成器 - PLSQL

时间:2013-01-17 08:21:08

标签: sql plsql

我正在尝试从以下Plsql包中获取序列号并更新给定contractObjId的行。我有一个java程序在线程环境中调用它。

多个线程可以同时调用并具有相同的contractobjId。我的问题是,当多个线程正在调用时,它正在生成重复的序列号。

请提出解决方案,并指出我在哪里做错了。

CREATE OR REPLACE PACKAGE BODY MANAGE_SEQ_NO IS
  PROCEDURE GET_NEXT_SEQ_NUM (contractobjid NUMBER, seqCur IN OUT SITECURTYP) IS
       seq_no NUMBER;
       seq_value NUMBER;
  BEGIN
     SELECT x_sequence_no 
     INTO seq_no 
     FROM table_contract 
     WHERE objid = contractObjid 
     FOR     UPDATE;
     IF seq_no IS NULL THEN
        seq_value := 1;
     ELSE
         seq_value := seq_no+1;
     END IF;
     UPDATE table_contract 
     SET x_sequence_no = seq_value 
     WHERE objid = contractObjid;
     COMMIT;
     OPEN seqCur FOR
     SELECT seq_value FROM dual;
  END GET_NEXT_SEQ_NUM;
END;
/

2 个答案:

答案 0 :(得分:1)

好吧,如果你不想使用真实的序列,你可以使用SELECT FOR UPDATE。这将锁定您正在阅读的行,您可以增加任何内容,然后执行更新。当然,它会锁定线路,并根据您的操作可能会产生一些可扩展性问题。

答案 1 :(得分:1)

  

“我们可以使用表锁定概念来锁定select语句。”

没有。没有什么可以阻止Oracle中的读者。