主键生成器

发表于:2007-07-02来源:作者:点击数: 标签:
这些天忙着做毕业设计,忙着敲代码,早发现像原来那样无聊的把那些技术文字再敲一遍是没有多大意义的,因为写出它们所用的时间要是仔细在看或者再用代码做几个实际的例子应该更好吧,其实这是早知道的,那以前知道还那么干,主要是因为太想做老师了吧!现在

这些天忙着做毕业设计,忙着敲代码,早发现像原来那样“无聊”的把那些技术文字再敲一遍是没有多大意义的,因为写出它们所用的时间要是仔细在看或者再用代码做几个实际的例子应该更好吧,其实这是早知道的,那以前知道还那么干,主要是因为太想做老师了吧!现在呢,不那么干不写了是因为暂时放弃做老师的打算吧,这两天空闲的时候复习数据库,翻到了以前的所写的一个存储过程“主键生成器”,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;


 

原文转自:http://www.ltesting.net