存储过程生成编号(游标、GOTO等)

存储过程生成编号(游标、GOTO等)

create or replace procedure PRO_UPDATE_SE_BNUM
       (in_T1_ID IN T1.T1_ID%TYPE,in_T2_PNUM IN T2.PRJNUM%TYPE) is
--更新编号
       BUILDNUM_INDEX NUMBER:=0;
       BUILDNUM_LEN NUMBER;
       BUILDNUM_ZERO VARCHAR2(10);
       BUILDNUM_ROWNUM NUMBER:=0;
       SID T3.ID%TYPE;        
       TEMPNUM T3.T3_PNUM%TYPE;
       TEMP_FLAG NUMBER:=0;--标志位 0 1

CURSOR SINGLE_CUR IS 
       SELECT S.ID,S.T3_PNUM FROM T3 S WHERE S.T1_ID = in_T1_ID ORDER BY TO_NUMBER(S.ID);    
begin 

      OPEN SINGLE_CUR;
           FETCH SINGLE_CUR INTO SID,TEMPNUM;                 
           LOOP
              EXIT WHEN NOT SINGLE_CUR%FOUND;

              SELECT (3-LENGTH(TO_CHAR(BUILDNUM_INDEX+1))) INTO BUILDNUM_LEN FROM DUAL; 
              WHILE BUILDNUM_LEN>0 LOOP
                BUILDNUM_ZERO := BUILDNUM_ZERO || '0';
                BUILDNUM_LEN := BUILDNUM_LEN - 1;
              END LOOP;             

              <<doBUILDNUM>> --循环点
              IF TEMP_FLAG = 0 THEN
                BUILDNUM_INDEX := BUILDNUM_INDEX + 1;                
                SELECT  count(1) INTO BUILDNUM_ROWNUM FROM T3 S WHERE S.T3_PNUM = (in_T2_PNUM||'-'||BUILDNUM_ZERO||BUILDNUM_INDEX);
                IF BUILDNUM_ROWNUM > 0 THEN                  
                  GOTO doBUILDNUM;
                ELSE
                  TEMP_FLAG := 1;  
                END IF;
              END IF;                

              IF LENGTH(TEMPNUM) < 10 OR LENGTH(TEMPNUM) IS NULL THEN  
                TEMP_FLAG := 0;
                UPDATE T3 SET T3_PNUM=(in_T2_PNUM||'-'||BUILDNUM_ZERO||BUILDNUM_INDEX) WHERE ID = SID;
                COMMIT;
              END IF; 

              BUILDNUM_ZERO := '';
              BUILDNUM_ROWNUM :=0;
              FETCH SINGLE_CUR INTO SID,TEMPNUM;   
           END LOOP;
      CLOSE SINGLE_CUR;      

      Exception
        When others then
          Rollback;
          Dbms_Output.put_line(Sqlerrm);        

end PRO_UPDATE_SE_BNUM;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值