楼主: DragonBill

[精华] (酱油)关于复活节最短源码的尝试

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
21#
发表于 2011-4-29 01:52 | 只看该作者
龙珠的ORACLE什么版本?我这里编译失败,E := R(I);报错。看了一下DM_ITEMS是个多列的嵌套表。

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
22#
 楼主| 发表于 2011-4-29 17:16 | 只看该作者

回复 #21 newkid 的帖子

SQL*Plus: Release 10.1.0.2.0 - Production on 星期五 4月 29 17:16:39 2011

Copyright (c) 1982, 2004, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
23#
 楼主| 发表于 2011-4-29 17:17 | 只看该作者

1227,玩不下去了。歇菜

create or replace package easter is
  PROCEDURE showAllEasterDay;
  PROCEDURE showMaxOccurenceEasterDay;
  PROCEDURE showLeapEasterDay;
  PROCEDURE showFoolEasterDay;
end;
/

create or replace package body easter is

  R     DM_ITEMS := DM_ITEMS();
  D        INT;
  B     INT := 0;
  C     INT := 0;
  E     INT;

  PROCEDURE O(L VARCHAR := ' ') IS
        S     CHAR(6);
  BEGIN
        IF L = ' ' THEN
                   FOR I IN 301..430 LOOP

                        E := R(I);

                        IF D < 99 THEN                                S := 0 || REPLACE(RPAD(I/100,4, 0),'.','-') || '/';
                        END IF;

                        IF E = D THEN
                                R(5) := R(5) || S;
                        END IF;

                        IF I < 400 AND E >= B THEN
                                B := E;
                                R(3) := R(3) || S;
                        END IF;

                        IF I > 400 AND E >= C THEN
                                C := E;
                                R(4) := R(4) || S;
                        END IF;

                        IF  I || E < 332 AND I > 321 OR I || E < 426 AND I > 400 THEN
                                R(2) := R(2) || S;
                        END IF;

                    END LOOP;
        END IF;
        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(5) || '     ' || D || '    ' || R(3) || '      ' || B || '    ' || R(4) || '      ' || C, '/ '));

   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;

        D := GREATEST(B, C);

        O;

END;
/


set serveroutput on
exec easter.showFoolEasterDay;
exec easter.showLeapEasterDay;
exec easter.showMaxOccurenceEasterDay;
exec easter.showAllEasterDay;

SELECT SUM(length(REPLACE(REPLACE(REPLACE(text, ' '), chr(9)), chr(10)))) bytes  FROM user_source WHERE NAME = 'EASTER';
/

[ 本帖最后由 DragonBill 于 2011-4-29 17:19 编辑 ]

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
24#
发表于 2011-4-29 17:53 | 只看该作者
不过,赞一个,降到 1225 了.

我这边也无法编译通过.

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
25#
发表于 2011-4-29 18:00 | 只看该作者
发生以下编译错误,都是在使用R(I)的地方:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott

SQL> SHOW ERR PACKAGE BODY EASTER
Errors for PACKAGE BODY SCOTT.EASTER:

LINE/COL ERROR
-------- -----------------------------------------------------------------
14/9     PLS-00382: expression is of wrong type
14/4     PL/SQL: Statement ignored
20/13    PLS-00306: wrong number or types of arguments in call to '||'
20/5     PL/SQL: Statement ignored
25/13    PLS-00306: wrong number or types of arguments in call to '||'
25/5     PL/SQL: Statement ignored
30/13    PLS-00306: wrong number or types of arguments in call to '||'
30/5     PL/SQL: Statement ignored
34/13    PLS-00306: wrong number or types of arguments in call to '||'
34/5     PL/SQL: Statement ignored
47/10    PLS-00306: wrong number or types of arguments in call to '||'
47/8     PL/SQL: Statement ignored
56/25    PLS-00306: wrong number or types of arguments in call to 'LENGTH'
55/8     PL/SQL: Statement ignored
64/6     PLS-00306: wrong number or types of arguments in call to 'SUBSTR'
63/2     PL/SQL: Statement ignored
72/14    PLS-00306: wrong number or types of arguments in call to '||'
71/2     PL/SQL: Statement ignored
84/21    PLS-00382: expression is of wrong type
84/13    PL/SQL: Statement ignored

SQL>

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
26#
发表于 2011-4-29 19:22 | 只看该作者
If you have not privileges to create your own type,
you use one of predeclared oracle type.

To find existing types you can use this query:

SELECT * FROM ALL_SOURCE
WHERE TYPE = 'TYPE'
and regexp_like( text, 'table.*of.*varchar', 'i' )
;



OWNER                          NAME                           TYPE         LINE                   TEXT                                                   
------------------------------ ------------------------------ ------------ ---------------------- --------------------------------------------------------
SYS                            DBMS_AW$_COLUMNLIST_T          TYPE         1                      TYPE     dbms_aw$_columnlist_t AS TABLE OF VARCHAR2(100)
SYS                            KU$_VCNT                       TYPE         1                      TYPE     ku$_vcnt AS TABLE OF VARCHAR2(4000)         
SYS                            DBMS_DEBUG_VC2COLL             TYPE         1                      TYPE dbms_debug_vc2coll is table of varchar2(1000)   
DMSYS                          DM_ITEMS                       TYPE         1                      TYPE DM_Items AS TABLE OF VARCHAR2(4000);            
DMSYS                          ORA_MINING_VARCHAR2_NT         TYPE         1                      TYPE ora_mining_varchar2_nt AS TABLE OF VARCHAR2(4000)
EXFSYS                         RLM$KEYVAL                     TYPE         1                      type        rlm$keyval is table of VARCHAR2(1000);
EXFSYS                         RLM$ROWIDTAB                   TYPE         1                      type        rlm$rowidtab is table of VARCHAR2(38);
MDSYS                          RDF_RULEBASES                  TYPE         1                      type RDF_RuleBases as table of varchar2(25)
MDSYS                          RDF_MODELS                     TYPE         1                      type RDF_Models as table of varchar2(25)  

9 rows selected



and for example lets use DM_ITEMS type from package DMSYS:


CREATE TABLE CODES AS
SELECT LEVEL CODE FROM DUAL
CONNECT BY LEVEL <= 10;

SELECT * FROM CODES
;

CODE                  
----------------------
1                     
2                     
3                     
4                     
5                     
6                     
7                     
8                     
9                     
10                     

10 rows selected




create or replace
PROCEDURE procedure_name( p_code_list IN DM_ITEMS )
AS
BEGIN
  FOR X IN (
    SELECT CODE
      FROM CODES
     WHERE code IN (SELECT column_value FROM TABLE( p_code_list ) ) )
  LOOP
    DBMS_OUTPUT.PUT_LINE( x.code );
  END LOOP;
END;
/


BEGIN
   procedure_name( dm_items( 2, 5, 8, 10 ) );
END;
/


2
5
8
10





Berns  


Posts: 11
Registered: 12/09/10  
  Re: Passing multiple values in a parameter

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
27#
发表于 2011-4-29 19:32 | 只看该作者
change to
  R     KU$_VCNT := KU$_VCNT();
is ok under 11.2

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
28#
发表于 2011-4-29 22:07 | 只看该作者
11g下面的dm_items已经转移到SYS用户,而且结构也变了。我找不到DMSYS这个用户。

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
29#
 楼主| 发表于 2011-4-29 23:22 | 只看该作者
换成 KU$_VCNT 是一样的

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
30#
 楼主| 发表于 2011-4-29 23:27 | 只看该作者
暂时不调了,就到此为止吧。什么时候想到了再玩

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表