Oracle 預存中 的循環!

Oracle 預存中 的循環!
 
 
/*=============================
查詢資料表 A10中的 A10_C4,A10_C5
A10_C4 相同時將A10_C5  寫到一個table表中的一格字段中
==============================*/
PROCEDURE SP_A10_Q6
(
    strA10_1_sta  VARCHAR2,--起始學年度(10)
     strA10_1_end  VARCHAR2,--截止學年度(10)
    strA10_C2   VARCHAR2,-- A教學(30)
    RC1     OUT CurSR0001,
    strMessage    OUT VARCHAR2,
    strStatus    OUT NUMBER
)
AS
/*===================================
--定義變數
===================================*/
V_strA10_1_sta  VARCHAR2(10);--學年度(10)
V_strA10_1_end  VARCHAR2(10);--學年度(10)
V_strA10_C2  VARCHAR2(30);--A教學(30)

CCOUNT       integer;
CNUM           integer;
 
 
/*===================================
--定義CURSOR變數CURSOR1
===================================*/
A10_C1  VARCHAR(100);
A10_C2  VARCHAR(100);
A10_C4  VARCHAR(100);
CURSOR  CURSOR1 IS
  SELECT  DISTINCT A10_C1,A10_C2,A10_C4
        FROM  A10
  WHERE A10_C1>=strA10_1_sta
             and A10_C1<=strA10_1_end
          and A10_C2 = strA10_C2
        ORDER BY A10_C1,A10_C2,A10_C4;
         R_CURSOR1 CURSOR1%rowtype;
 
/*===================================
--定義CURSOR變數CURSOR2
===================================*/
 
A10_C1_2 VARCHAR(100);
A10_C2_2 VARCHAR(100);
A10_C4_2 VARCHAR(100);
A10_C5_2 VARCHAR(100);
CURSOR  CURSOR2 IS
  SELECT  DISTINCT
          A10_C1 AS A10_C1_2,
                A10_C2 AS A10_C2_2,
                A10_C4 AS A10_C4_2,
                A10_C5 AS A10_C5_2
        FROM  A10
  WHERE A10_C1>=strA10_1_sta
             and A10_C1<=strA10_1_end
          and A10_C2 = strA10_C2
        ORDER BY A10_C1,A10_C2,A10_C4,A10_C5;
         R_CURSOR2 CURSOR2%rowtype;
 

A10_C5_SQL  VARCHAR2(1000);--重要措施(1000)
A10_C5B         VARCHAR2(100);--重要措施(100)
BEGIN
 CCOUNT  := 0;--相同目標下重要措施的資料筆數
 CNUM :=0;--變數
 DELETE  FROM A10B;
    /*===================================
    --宣告變數
    ===================================*/
    V_strA10_1_sta   := TRIM(strA10_1_sta);
    V_strA10_1_end   := TRIM(strA10_1_end);
    V_strA10_C2    := TRIM(strA10_C2);
    A10_C1   := '';
    A10_C2   := '';
    A10_C4   := '';
    A10_C1_2  := '';
    A10_C2_2  := '';
    A10_C4_2  := '';
    A10_C5_2  := '';
    A10_C5B   := '';--中間變量
   A10_C5_SQL  := '';
    strMessage  := '';

  OPEN  CURSOR1;
   LOOP
     FETCH  CURSOR1  into  R_CURSOR1;
        EXIT  WHEN   CURSOR1%notfound;
        OPEN  CURSOR2;
         SELECT count(*) into CCount
        FROM  A10
  WHERE A10_C1>=strA10_1_sta
             and A10_C1<=strA10_1_end
          and A10_C2 = strA10_C2;
    LOOP
         FETCH  CURSOR2  into  R_CURSOR2;
         EXIT  WHEN   CURSOR2%notfound;
  if(CNum<=CCount)   then
      begin

           IF (R_CURSOR1.A10_C1=R_CURSOR2.A10_C1_2 AND R_CURSOR1.A10_C2=R_CURSOR2.A10_C2_2 AND R_CURSOR1.A10_C4=R_CURSOR2.A10_C4_2)         THEN
             BEGIN
                CNum := CNum+1;
                    A10_C5B  :=  CNum||'.'||TRIM(R_CURSOR2.A10_C5_2);
                    A10_C5_SQL :=TRIM(A10_C5_SQL)||TRIM(A10_C5B)||'/n';
             END;
        END IF;
     end;
end if;
        END LOOP;
 
  CLOSE CURSOR2;
 
     INSERT  INTO A10B
             (
                 A10B_C1,A10B_C2,A10B_C3,A10B_C4,A10B_C5
                )
              VALUES
                (
                TRIM(R_CURSOR1.A10_C1), TRIM(R_CURSOR1.A10_C2),'',
                TRIM(R_CURSOR1.A10_C4),TRIM(A10_C5_SQL)
                );
  END LOOP;
  --CLOSE CURSOR2;
  CLOSE CURSOR1;
  /*===================================
 --取出最後的結果結合CURSOR
A10B實體表。存DATA
 ===================================*/
 OPEN  RC1  FOR
    SELECT  *
    FROM  A10B;

    /*===================================
    --例外處理
    ===================================*/
 exception
     when no_data_found then
         strMessage := '資料處理失敗!!';
            strStatus := 2;
        when others then
    strMessage := SQLERRM;
     strStatus := 1;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值