最近在作oracle相關的項目,剛接觸oracle,與sqlserver語法上仍是有區別的sql
sqlserver :oracle
示例:FX+當前年月日+00001函數
以下圖流水號實力所示sqlserver
原理:編碼
首先 'FX'是固定的,獲取當前年月日方法在sqlserver中分別是:spa
1.年:YEAR(GETDATE())code
2.月:month(getdate())server
3.日:DAY(GETDATE())blog
其次最主要的是流水號自動加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.固然實現流水號不止函數這種方式,也能夠利用存儲過程來實現,有興趣的朋友能夠研究下。