您的位置:首页 > 其它

oralce 获取自定义主键编码,有并发问题

2016-01-14 16:27 197 查看
F_GET_SEQUENCE,功能函数
,当多个服务同时调用此函数,可能产生并发问题,待解决,加主键。

CREATE OR REPLACE Function F_Get_Sequence(As_Companyno In Varchar2,
As_Tablename In Varchar2,
As_Prefix    In Varchar2)
Return Varchar2 Is
As_Seqvalue       Varchar(32);
As_Tablenameupper Varchar2(64);
As_Count          Number(6);
As_Sql            Varchar2(500);
Begin
As_Tablenameupper := Upper(As_Tablename);
Select Count(1)
Into As_Count
From Basic_Sequence t
Where T.Companyno = As_Companyno
And T.Tablename = As_Tablenameupper;
If As_Count = 0 Then
Begin
As_Sql := 'Insert Into Basic_Sequence(Companyno,Tablename, Currentvalue) Values (:Companyno,:Tablename, 0)';
Execute Immediate As_Sql
Using As_Companyno, As_Tablenameupper;
Commit;
End;
End If;

Update Basic_Sequence t
Set T.Currentvalue = T.Currentvalue + 1
Where T.Companyno = As_Companyno
And T.Tablename = As_Tablenameupper;
Select Currentvalue
Into As_Seqvalue
From Basic_Sequence t
Where T.Companyno = As_Companyno
And T.Tablename = As_Tablenameupper;
As_Seqvalue := As_Prefix || To_Char(Sysdate, 'yyyymmdd') ||
Lpad(As_Seqvalue, 6, '0');
Return(As_Seqvalue);
End F_Get_Sequence;


表结构:

CREATE TABLE "Test"."BASIC_SEQUENCE"
(	"COMPANYNO" VARCHAR2(32),
"TABLENAME" VARCHAR2(64),
"CURRENTVALUE" NUMBER(12,0)
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "Test_DATA" ;
COMMENT ON COLUMN "SHERP"."BASIC_SEQUENCE"."COMPANYNO" IS 'Id';
COMMENT ON COLUMN "SHERP"."BASIC_SEQUENCE"."TABLENAME" IS '表名';
COMMENT ON COLUMN "SHERP"."BASIC_SEQUENCE"."CURRENTVALUE" IS '当前值';
COMMENT ON TABLE "SHERP"."BASIC_SEQUENCE"  IS '基础序列表(生产连续Id)';


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: