次の 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;
/