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;