F_GET_SEQUENCE,功能函数
,当多个服务同时调用此函数,可能产生并发问题,待解决,加主键。
CREATE OR REPLACE Function f_Get_Sequence(As_Companyno In Varchar2,
As_Tablename In Varchar2,
As_Prefix In Varchar2,
As_Number In Number := 6)
Return Varchar2 Is
As_Seqvalue Varchar(32);
As_Tablenameupper Varchar2(64);
As_Count Number(6);
As_Sql Varchar2(500);
As_Length Number(6);
Begin
If As_Number Is Null Then
As_Length := 6;
Else
As_Length := As_Number;
End If;
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 mod(Currentvalue,decode(As_Length,1,10,2,100,3,1000,4,10000,5,100000,1000000))
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, As_Length, '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)';