oracle 順序號生成函式。仿Sequence

2022-03-17 11:03:26 字數 2723 閱讀 7598

問題提出自專案中的老**:乙個bill表,儲存所有的表單資訊,比如:員工入職單,離職單等等。(別噴,我知道要分多個表。但領導的意願你是沒辦法違背的)表單的單據號是以四個字母+年月日+數字順序號來表示。每次取新單據號時要從bill表裡(按生成規則)查詢出最大的那個單據號,再拆分出來,再給順序號加1,組合好後再寫回。哈哈這就是老**。

隨著軟體行業的進步,各種技巧層出不窮。而針對順序號生成的方法也有好巨大改進。

[oracle]仿oracle sequence的自定義年份sequence(適合任何資料庫)

這裡其中的一篇。看過這個之後就想自己動手也寫乙個。於是:

順序號表

--

id序列表

create

table

sequences

( id

varchar2(20) not

null

primary

key,--

標識 minvalue number

default

1,--

最小值 maxvalue number

default

9999999999999999999999999999,--

最大值 currentvalue number

default

1,--

當前值 increaseby number

default

1,--

增量 cycle char(1) default'0

'--是否迴圈

)

生成函式

--

獲取 select nextvalue('abc') from dual;

create

orreplace

function nextvalue(arg varchar2) return

number

ispragma autonomous_transaction;

result

number

; x

number

; a

number

; i

number

; c

char(1

);begin

if trim(arg) is

null

then

--防止值入空字串

6502,'

param "arg" is not valide.

',true);

endif;

<<

top>>

select

count(1) into x from sequences where id =

arg;

if x =

0then

begin

begin

insert

into sequences (id) values(arg);--

防止併發同時插入相同的id值。需要將id設為主鍵

exception

when others then

goto

top;

end;

commit

;

return1;

end;

else

begin

select s.currentvalue + s.increaseby,s.maxvalue,s.minvalue,s.cycle into result,a,i,c from sequences s where id = arg for

update;--

for update將鎖定此行記錄

if result < a then

--未超出最大值

begin

update sequences set currentvalue = result where id =

arg;

commit

;

return

(result);

end;

else

begin

if c ='0

'then

--不迴圈

begin

-6502,'

out of range.

',true);

end;

else

begin

--迴圈

update sequences set currentvalue = i where id =

arg;

commit

;

return

i;

end;

endif

;

end;

endif

;

end;

endif;

end;

是的,我使用了引數。這樣就使得這個表更加有用,而非只單獨處理一種型別順序號。同時對併發進行了處理。讓你只可能取得乙個值,而不會出現重複的值。當然所有的result都沒有進行格式化,而是直接輸出。在plsql中進行函式test,開啟兩個視窗,單步除錯,可以看到在insert或select for update時都會阻塞其它session對此表的操作。這樣可以使用result的結果唯一。

根據日期 順序號生成流水號的儲存過程

前幾天做乙個專案,要求能按日期 順序號生成流水號,檢視網上相關方法發現都差不多,但是沒有完整的編碼,被逼無賴,自己做乙個,頂一頂也用起來了.本儲存過程在sql server 2000下測試通過 create procedure dbo createpcdid pcdid char 20 output...

sql 四個排名函式 生成記錄序號

排名函式是sql server2005新加的功能。在sql server2005中有如下四個排名函式 1.row number順序生成序號 2.rank相同的序值序號相同,但序號會跳號 3.dense rank相同的序值序號相同,序號順充遞增 4.ntile裝桶,把記錄分成指的桶數,編序號 下面分別...

Oracle生成隨機函式

1.基礎認識 關於這些函式及dbms random包的檔案都包含在sqlplus中 select text from all source where name dbms random and type package order by line type num array procedure t...