|
拿掉了 S, X 变量,并且取消 IF D < 99...语句,改用R(I*3)架构存放日期格式字符串, 压至 1176
create or replace package easter is
PROCEDURE showAllEasterDay;
PROCEDURE showMaxOccurenceEasterDay;
PROCEDURE showLeapEasterDay;
PROCEDURE showFoolEasterDay;
end;
/
create or replace package body easter is
R KU$_VCNT := KU$_VCNT();
D INT;
PROCEDURE O(L VARCHAR := ' ') IS
E INT;
BEGIN
FOR I IN 301*INSTR(L, ' ')..430 LOOP
D := TRUNC(I/100);
E := R(I);
IF E >= 0 || R(D) THEN
R(D) := E;
R(5 + D) := R(5 + D) || R(I * 3);
R(9 + E) := R(9 + E) || R(I * 3);
END IF;
IF I > 321 AND I || E < 332 OR I > 400 AND I || E < 426 THEN
R(2) := R(2) || R(I * 3);
END IF;
R(I * 3) := 0 || D || TO_CHAR(-I MOD 100,'09') || '/';
END LOOP;
DBMS_OUTPUT.PUT_LINE(L);
END;
PROCEDURE showAllEasterDay IS
BEGIN
O('YEAR DAY');
FOR X IN 2011..2099 LOOP
O(X || R(X));
END LOOP;
END;
PROCEDURE showFoolEasterDay IS
BEGIN
O('YEAR TOTAL
' || REPLACE(R(802),'#',LENGTH(R(802))/7));
END;
PROCEDURE showLeapEasterDay IS
BEGIN
O('ABSENT_START ABSENT_END
' || SUBSTR(R(2),1,5) || ' ' || SUBSTR(R(2),-6,5));
END;
PROCEDURE showMaxOccurenceEasterDay IS
BEGIN
O('MAXOCC MO_CNT MAXOCC_3 MO3_CNT MAXOCC_4 MO4_CNT
' || REPLACE(R(9 + D) || ' ' || D || ' ' || R(8) || ' ' || R(3) || ' ' || R(9) || ' ' || R(4), '/ '));
END;
BEGIN
FOR I IN 2011..2099 LOOP
R.EXTEND(I);
D := (234 - I MOD 19 * 11) MOD 30 ;
D := D + INSTR(27-D,'-');
R(I) := TO_CHAR(DATE'1-3-28' + D - (I + TRUNC(I / 4) + D + 1) MOD 7,' MM-DD');
D := REPLACE(R(I),'-');
R(D*2) := R(D*2) || I || ' #
';
R(D) := 0 || R(D) + 1;
END LOOP;
O;
O;
D := GREATEST(R(3), R(4));END;
/
[ 本帖最后由 DragonBill 于 2011-4-30 15:09 编辑 ] |
|