問題提出自專案中的老**:乙個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...