|
本帖最后由 阿吉2009 于 2017-2-28 09:04 编辑
CREATE OR REPLACE PROCEDURE NEXTSEQNO
(
P_PREFIX IN VARCHAR2,
P_NEXTVAL OUT NUMBER
) IS
BEGIN
P_NEXTVAL := 1;
begin
--若前缀不存在则插入,但插入时若因并发前缀已存在则引发违反唯一索引的错误;
--若前缀已存在则跳过。
INSERT INTO SEQUENCERS
SELECT SEQ_ACTION_TYPE.NEXTVAL,
1,
P_PREFIX
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM SEQUENCERS WHERE PREFIX = P_PREFIX);
EXCEPTION
WHEN DUP_VAL_ON_INDEX then --违反唯一索引
UPDATE SEQUENCERS T SET T.SEED = T.SEED + 1 WHERE PREFIX = P_PREFIX RETURNING T.SEED INTO P_NEXTVAL;
COMMIT;
RETURN;
WHEN OTHERS THEN
RAISE;
END;
--若因已存在而没插入新记录,则更新后获取新值
IF SQL%ROWCOUNT = 0 THEN
UPDATE SEQUENCERS T SET T.SEED = T.SEED + 1 WHERE PREFIX = P_PREFIX RETURNING T.SEED INTO P_NEXTVAL;
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END NEXTSEQNO;
--表结构-- Create table
create table SEQUENCERS
(
id NUMBER,
seed NUMBER,
prefix VARCHAR2(1)
)
tablespace MES_DATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table SEQUENCERS
add constraint UQ_PREFIX unique (PREFIX)
using index
tablespace MES_DATA
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
昨天试写了这个过程,多会话测试没问题。大家看有无BUG.
|
|