最近在做oracle相關的項目,剛接觸oracle,與sqlserver語法上還是有區別的
sqlserver :
示例:FX+當前年月日+00001
如下圖流水號實力所示
原理:
首先 'FX'是固定的,獲取當前年月日方法在sqlserver中分別是:
1.年:YEAR(GETDATE())
2.月:month(getdate())
3.日:DAY(GETDATE())
其次最主要的是流水號自動加1,主要思路是獲取到當前表中FxNum最大的數(後6位最大的數),並且用right函數獲取後6位並且加1。
sql函數代碼如下:
Create function [dbo].[f_GetFxNum]() returns varchar(15) as begin declare @FxNum varchar(15) declare @time varchar(8) set @time=CONVERT(varchar,YEAR(GETDATE()))+RIGHT('00'+CONVERT(varchar,month(getdate())),2)+CONVERT(varchar,DAY(GETDATE()))--取到當前年月日 select @FxNum='FX'+@time+RIGHT(100000+ISNULL(RIGHT(MAX(FxNum),5),0)+1,5)--獲取當前表最大值並加1 from PX_FxRecord return @FxNum end ALTER TABLE PX_FxRecord ADD DEFAULT ([dbo].[f_GetFxNum]()) FOR FxNum --將該函數綁定到FxNum作為該字段的默認值
參數說明:
Right(str,len) -字段返回最右邊的len個字符的字符串str
MAX() -字段中最大的值
IsNull() -判斷內容是否為空
convert() -格式轉換
Oracle:
oracle比sql語法上簡單精煉一點,其實思路都一樣,編碼模式以'FX'開頭後8位年月日再加8位流水號,在該表中查詢當日最大號加1,若沒有,則從系統時間最小數開始(FX+當前年月日+000001),一直加1.
sql中的right函數在oracle中用substr代替
oracle函數代碼如下:
create or replace function f_GetFxNum return nvarchar2 as FxNum nvarchar2(16); begin SELECT 'FX'||(NVL(MAX(SUBSTR(FxNum,3,14)),TO_CHAR(SYSDATE,'YYYYMMDD')||'000000')+1) into FxNum FROM PX_FxRecord WHERE SUBSTR(FxNum,3,8)=TO_CHAR(SYSDATE,'YYYYMMDD') ; return FxNum; end;
參數說明:
1.substr(str,截取開始位置,len) //返回截取的字, right(str,len) 返回從最右邊開始len個字符串
2.TO_CHAR(SYSDATE,'YYYYMMDD') //返回當前年月日
3.NVL() // NVL(str1,str2) 如果oracle第一個參數為空那麼顯示第二個參數的值,如果第一個參數的值不為空,則顯示第一個參數本來的值。
總結
1.oracle和sqlserver思想原理都差不多,基於sql開發,只是語法實現方式上不同。
2.當然實現流水號不止函數這種方式,也可以利用存儲過程來實現,有興趣的朋友可以研究下。