|
用了OO的SUBTYPE以后下降为1267:
CREATE OR REPLACE PACKAGE easter
AS
PROCEDURE showAllEasterDay;
PROCEDURE showMaxOccurenceEasterDay;
PROCEDURE showLeapEasterDay;
PROCEDURE showFoolEasterDay;
END;
/
CREATE OR REPLACE PACKAGE BODY easter
AS
SUBTYPE v IS VARCHAR(999);
M v;
r SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
F v :='YEAR TOTAL
';
c v :=0;
d DATE :=DATE '1-4-25';
PROCEDURE p(s v)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE(s);
END;
PROCEDURE showAllEasterDay
AS
BEGIN
p('YEAR DAY');
FOR i IN 1..r.COUNT LOOP
p(i+2010||' '||r(i));
END LOOP;
END;
FUNCTION g(i v) RETURN v
AS
s v;
BEGIN
select listagg(e,'/') WITHIN GROUP(ORDER BY e)||' '||MAX(c)
INTO s
FROM (SELECT e,RANK() OVER(ORDER BY -COUNT(*)) r,COUNT(*) c
FROM (SELECT COLUMN_VALUE e
FROM TABLE(r)
)
WHERE e LIKE '0'||i||'%'
GROUP BY e
)
WHERE r=1;
RETURN s||' ';
END;
PROCEDURE showMaxOccurenceEasterDay
AS
BEGIN
p('MAXOCC MO_CNT MAXOCC_3 MO3_CNT MAXOCC_4 MO4_CNT
'||g('')||g(3)||g(4));
END;
PROCEDURE showLeapEasterDay
AS
BEGIN
p('ABSENT_START ABSENT_END');
FOR l IN (
SELECT MIN(e)||' '||MAX(e) s
FROM (SELECT TO_CHAR(d+1-LEVEL,'MM-DD') e FROM DUAL CONNECT BY LEVEL<=34
MINUS
SELECT * FROM TABLE(r)
ORDER BY 1
)
GROUP BY TO_DATE(e,'MM-DD')-ROWNUM
) LOOP
p(l.s);
END LOOP;
END;
PROCEDURE showFoolEasterDay
AS
BEGIN
p(REPLACE(f,'@',C||'
'));
END;
BEGIN
FOR N IN 111..199 LOOP
r.EXTEND(1);
M:=MOD(11*MOD(N,19)+4-TRUNC((7*MOD(N,19)+1)/19),29);
M:=M+MOD(N+TRUNC(N/4)+31-M,7);
r(n-110):=TO_CHAR(D-M,'MM-DD');
IF M=24 THEN
c:=c+1;
f:=f||(1900+n)||' @';
END IF;
END LOOP;
END;
/
等有空看能不能把其他技巧再加进来。 |
|