主鍵產生器

來源:互聯網
上載者:User

這些天忙著做畢業設計,忙著敲代碼,早發現像原來那樣“無聊”的把那些技術文字再敲一遍是沒有多大意義的,因為寫出它們所用的時間要是仔細在看或者再用代碼做幾個實際的例子應該更好吧,其實這是早知道的,那以前知道還那麼幹,主要是因為太想做老師了吧!現在呢,不那麼幹不寫了是因為暫時放棄做老師的打算吧,這兩天閒置時候覆習資料庫,翻到了以前的所寫的一個預存程序“主鍵產生器”,SQLServer版本的是在以前項目中用過的,Oracle版本的是後面學習Oracle時補上的,不管怎麼樣,有看了一遍,敲了一遍,將來面視的時候也許用得著吧。

SQLServer版

USE TEST

IF EXISTS (SELECT name FROM sysobjects    --檢查系統中是否 有與自訂預存程序同名的對象

         WHERE name = 'getNo' AND type = 'P')

   DROP PROCEDURE getNo

GO

  CREATE PROCEDURE getNo 

                  @precRecord varchar(10),    --3個參數。第1個 為輸入參數(表名);第3個 為輸入

          --參數(用以判斷輸出格式);; 第2個 為輸出參數 (最後產生的主鍵編號)

                  @primarykey varchar(12) output ,           --若第3個參數等於0時,主鍵= 字軌+時期+編號 

                          -- 若第3個參數等於1時,主鍵=字軌+編號

                  @sign  smallint                                  --         若第3個參數等於其他時 報錯

AS

    declare @prctmpdate datetime,                        --臨時變數,用以記錄預存程序中的中間變數

        @today datetime,

        @tmpprenum   varchar(4),

        @tmpword   varchar(2),

        @year1  varchar(2),

        @day1   varchar(2),

        @month1 varchar(2) ------------------------------------------------------------------------------------------------------------

set @today = getdate()

if not exists(select fRecord from tbrecno where fRecord=@precRecord)   --若表中沒有與參數1同名的則新插入一條

   begin

  insert into tbrecno  (fRecord,Predate,Prenum,Word) values(@precRecord,@today,1,left(@precRecord,2))

   end

else

   begin

       select @prctmpdate=Predate from tbrecno where fRecord=@precRecord

       if ( datediff (day, @today , @prctmpdate ) < 0 )   --比較    若當前日期<上次日期  ,令  

                   --上次日期=上次日期 且 上次編號置為零

           begin

             update tbrecno  set Prenum = '1' ,predate = @today where fRecord=@precRecord

           end 

       else if (datediff(day,  @today , @prctmpdate ) = 0 )  --若當前日期=上次日期  ,令上次編號加一

           begin

             update tbrecno set Prenum = Prenum + 1 where fRecord=@precRecord     

           end

       else if ( datediff (day, @today , @prctmpdate ) > 0 )               --若當前日期〈上次日期  ,報錯

           begin

             raiserror ('the db server date erreor  check system date please!', 16, 1)

           end

  end

---------------------------------------------------------------------------------------------------------------

 

  select  @prctmpdate=Predate,@tmpword=Word, @tmpprenum=prenum from tbrecno where fRecord=@precRecord

  select @tmpprenum=                                                                --上次編號不夠四位的補夠四位

              case len(ltrim(rtrim(@tmpprenum)))

               when 1 then '000'+rtrim(ltrim(@tmpprenum))

                when 2 then '00'+ rtrim(ltrim(@tmpprenum))

                when 3 then '0'+  rtrim(ltrim(@tmpprenum))

                when 4 then       rtrim(ltrim(@tmpprenum))

              end

-----------------------------------------------------------------------------------------------------------------

set @year1 =right(ltrim(rtrim((str(year(@prctmpdate ))))),2)                      --取出年份

select @month1=

               case len (ltrim(str(month(@prctmpdate))))                   --取出月份,若不夠兩位的補夠兩位

                 when 1 then '0'+ltrim(str(month(@prctmpdate )))

                 when 2 then     ltrim(str(month(@prctmpdate )))

               end

select @day1=                                                                        --取出天數,若不夠兩位的補夠兩位

               case len (ltrim(str(day(@prctmpdate))))

                 when 1 then '0'+ltrim(str(day(@prctmpdate )))

                 when 2 then  ltrim(str(day(@prctmpdate )))

               end

----------------------------------------------------------------------------------------------------------------

 if @sign=1

    begin                                                                             --判斷輸出類型

       set  @primarykey =rtrim(ltrim(@tmpword))+ @tmpprenum

    end

 else if   @sign=0

    begin

        set @primarykey = @tmpword+ @year1 + @month1 + @day1 + @tmpprenum

    end

 else

    begin

      raiserror ('parameter error', 16, 1)  

    end

--------------------------------------------------------------------------

GO

-------------------------------------------------------------------

--                                    測試

declare @mybillno varchar(12) 

 exec getNo 'pG', @mybillno output,0

  select @mybillno

--  IF EXISTS (select * from Tbrecno where word = left(ltrim(rtrim( @precRecord )),2))

      --    raiserror ('表名的前兩個字母與已有的發生衝突 請修改表名', 16, 1)

-- delete tbrecno

--
--select * from tbrecno
Oracle版

create or replace procedure getmykeyno(
sign varchar2,
tablename varchar2,
outkey out varchar2
)
is

-- sign getmykey.my_ziguei %type; 
-- tablename getmykey.my_tablename %type; 
--outkey varchar(20);

lastdate getmykey.my_lastdate%type;
tmpint getmykey.my_lastno %type;
nowdate date;
tmpStr varchar(4);
tmpsign varchar(2);

myyear int;
mymonth int;
myday int;

tmpcount int;

begin
myyear := extract(year from sysdate);
mymonth := extract(month from sysdate);
myday := extract(day from sysdate);

nowdate:=sysdate;
--tablename:='aaaa';
--sign:='ad';

select count(*) into tmpcount from getmykey where my_tablename = tablename;
if tmpcount=0 then

   begin
      insert into getmyke(my_tablename,my_ziguei,my_lastno,my_lastdate) values          (tablename,sign,1,nowdate) ;tmpInt := 1;
end;
else 
select my_lastdate into lastdate from getmykey where my_tablename=tablename ;

if (myyear>=extract(year from lastdate) and mymonth>=extract(month from lastdate)) then

if(myday=extract(day from lastdate)) then

update getmykey set my_lastno = my_lastno + 1 where my_tablename=tablename; 
select my_lastno into tmpint from getmykey where my_tablename=tablename;

else 
if (myday > extract(day from lastdate)) then

update getmykey set my_lastno = 1 where my_tablename=tablename ;
update getmykey set my_lastdate = nowdate where my_tablename=tablename;
tmpInt := 1 ;
else 
dbms_output.put_line('伺服器的時間改變,請檢查系統!');
end if; 

end if; 
end if; 

end if;
tmpStr:=lpad(to_char(tmpint),4,'0');

-- dbms_output.put_line(tmpstr);

outkey := substr(to_char(myyear),3,2) || lpad(to_char(mymonth),2,'0') || lpad(to_char(myday),2,'0') || tmpStr;
select my_ziguei into tmpsign from getmykey where my_tablename=tablename;

outkey:=tmpsign ||outkey;
--dbms_output.put_line(outkey);

end;


 


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。