楼主: yulihua49

[PRO*C] 看我做的数据库包装器

[复制链接]
论坛徽章:
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
441#
发表于 2009-11-30 09:21 | 只看该作者
bookmark

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
442#
 楼主| 发表于 2009-11-30 20:53 | 只看该作者
原帖由 newkid 于 2009-11-29 22:23 发表

我只是不喜欢你把赋值割得支离破碎,我认为应该是一连串紧挨着的语句,你阅读的时候才知道为了获得数据总共需要哪些参数。

这就赖我们老板了,他一定要把数据访问逻辑从应用剥离到DAO里边去。所以,赋值在应用层,语句在DAO层。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
443#
 楼主| 发表于 2009-11-30 20:57 | 只看该作者
原帖由 newkid 于 2009-11-29 22:15 发表

不知道为什么一定要映射到结构。我们以前都是把结果集当作二维数组来访问。
在11G以前,PLSQL不能动态访问REF CURSOR的结构。11G以后可以用DBMS_SQL实现了,因此你说的JASON打包,日期统一格式化输出,也就是一句话的事,做一个通用的格式化模块就可以了。当然这些用C来做我完全赞成,因为只是格式化。你不用结构,只需要写一个通用的模块访问结果集并对数据格式化。
"数据库服务器是整个系统的瓶颈资源" 你的偏见才是整个系统的瓶颈。你以前说售票模块会“堵车”,我写了一个存储过程并证明了它能高效运行;你的生成票据的模块,我也用更简单高效的方法实现了。对于你类似的没有论据的论点,我只有一句话:拿出实例来!

JAVA是面向对象,C只能面向结构了,你一句话要打一大包数据,不用结构用什么呢?一个数据的集合,只有结构啊。
我就是做了一个通用格式化模块访问结构啊,又一个通用模块把结果集映射到结构。
没好意思说,你那个发布席位的模块我调通了,运行结果正确,不过时间没我快。可能是用中间表倒来倒去。我是用中间变量倒来倒去。

[ 本帖最后由 yulihua49 于 2009-11-30 21:07 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
444#
发表于 2009-11-30 22:38 | 只看该作者
原帖由 yulihua49 于 2009-11-30 20:57 发表

JAVA是面向对象,C只能面向结构了,你一句话要打一大包数据,不用结构用什么呢?一个数据的集合,只有结构啊。
我就是做了一个通用格式化模块访问结构啊,又一个通用模块把结果集映射到结构。
没好意思说,你那个发布席位的模块我调通了,运行结果正确,不过时间没我快。可能是用中间表倒来倒去。我是用中间变量倒来倒去。

是吗?你都改了哪些?把你调过的程序贴出来。

使用道具 举报

回复
论坛徽章:
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
445#
发表于 2009-12-1 04:49 | 只看该作者
:{关闭帖子有bug,对斑竹无效

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
446#
发表于 2009-12-1 06:03 | 只看该作者
这就关闭了?楼主隔了大半年然后说我的程序“没他的快”,我正等着和他来一轮新的PK呢。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
447#
 楼主| 发表于 2009-12-1 09:36 | 只看该作者
原帖由 newkid 于 2009-12-1 06:03 发表
这就关闭了?楼主隔了大半年然后说我的程序“没他的快”,我正等着和他来一轮新的PK呢。


  1. CREATE GLOBAL TEMPORARY TABLE seat_parameter (    -- 参数表
  2.           dflg           NUMBER(1)    -- 控制JOBDAY的计算
  3.          ,start_date     DATE         -- today
  4.          ,end_date       DATE         -- 如果非空,则可以生成多天的数据
  5.          ,train_no       VARCHAR2(12) -- 如果为0或NULL则忽略
  6.           ) ON COMMIT DELETE ROWS
  7. /

  8. -- 把两个复杂查询抽出来建立视图:
  9. CREATE OR REPLACE VIEW vw_train
  10. AS  ------ 无号和普通都用到的一些变换计算和公共子查询(车次和停靠站的选取)
  11. SELECT t.train_no
  12.       ,t.gride  
  13.       ,t.station_num
  14.       ,t.jobday
  15.       ,t.item
  16.       ,cz.station_code                                           AS beg_station
  17.       ,t.jobday+(t.start_time+cz.running_time+cz.stop_time)/1440 AS on_date
  18.       ,cz.run_train_no                                           AS run_train
  19.       ,cz.over
  20.       ,cz.sequence
  21.   FROM (SELECT t2.*
  22.               ,SUBSTR(cycle,MOD(jobday-beg_date, LENGTH(cycle))+1,1)   AS item -- 原来少写了个LENGTH
  23.          FROM (SELECT train.*
  24.                      ,(CASE WHEN NVL(p.dflg,0)=0 THEN p.today + (CASE WHEN train.days>0 THEN train.days ELSE 10 END)
  25.                             ELSE today
  26.                        END) AS jobday     --- 如果dflg为空则从train表中取得
  27.                FROM train
  28.                    ,(SELECT dflg   -- 根据end_date,start_date算出一个today的集合。如果相等或end_date为空则只有一行
  29.                            ,start_date + ROWNUM -1 AS today
  30.                            ,train_no
  31.                        FROM seat_parameter
  32.                      CONNECT BY ROWNUM <= NVL(end_date,start_date) - start_date +1
  33.                      ) p     
  34.                WHERE train.flag=0 AND train.end_date >= p.today
  35.                      AND (train.train_no=p.train_no OR NVL(p.train_no,'0')='0')
  36.               ) t2
  37.         ) t
  38.       ,stop_station cz
  39. WHERE t.jobday BETWEEN t.beg_date AND t.end_date
  40.        AND t.item<>'0'
  41.        AND cz.train_no=t.train_no
  42.        AND t.jobday BETWEEN cz.beg_date AND cz.end_date
  43.        AND cz.flag=0
  44. /


  45. CREATE OR REPLACE VIEW vw_seat
  46. AS    --- 利用上述视图vw_train和附加逻辑生成席位
  47. WITH tr AS (SELECT * FROM vw_train)
  48.     ,vw_seat_no AS (SELECT ROWNUM as seat_no FROM DUAL CONNECT BY ROWNUM<=200)
  49. SELECT -- 第一部分:发布无号席位
  50.        tr.train_no          AS train_no         
  51.       ,tr.gride             AS gride  
  52.       ,tr.station_num-1     AS end_station      
  53.       ,tr.jobday            AS start_date                                
  54.       ,0                    AS carno                                    
  55.       ,0                    AS purpose                                   
  56.       ,0                    AS seat_type                                 
  57.       ,0                    AS shortest_station                          
  58.       ,0                    AS flag                                      
  59.       ,tr.beg_station       AS beg_station      
  60.       ,tr.on_date           AS on_date      
  61.       ,tr.run_train         AS run_train   
  62.       ,0                    AS pro         
  63.       ,vw_seat_no.seat_no   AS seat_no      
  64. FROM  tr
  65.      ,vw_seat_no
  66. WHERE --tr.station_num-1 > tr.sequence        
  67.        tr.over >= vw_seat_no.seat_no     
  68. UNION ALL -- 第二部分:发布普通席位
  69. SELECT tr.train_no          AS train_no              
  70.       ,ps.gride             AS gride                 
  71.       ,ps.end_station       AS end_station           
  72.       ,tr.jobday            AS start_date            
  73.       ,ps.carno             AS carno                       
  74.       ,ps.purpose           AS purpose               
  75.       ,(CASE WHEN ps.seat_type = 20 THEN 20+vw_seat_type_adj.rn         -- 硬卧是一席3号,下中上。seat_type:20=硬卧,21硬卧下,22硬卧中,23硬卧上
  76.              WHEN ps.seat_type = 30 THEN 31+MOD(vw_seat_no.seat_no+1,2) -- 软卧是一席一号单下双上: 30软卧,31软卧下,32软卧上。
  77.              ELSE ps.seat_type
  78.         END)                AS seat_type            
  79.       ,ps.shortest_station  AS shortest_station      
  80.       ,0                    AS flag                                    
  81.       ,tr.beg_station       AS beg_station           
  82.       ,tr.on_date           AS on_date               
  83.       ,tr.run_train         AS run_train            
  84.       ,0                    AS pro                  
  85.       ,vw_seat_no.seat_no   AS seat_no               
  86.   FROM tr
  87.       ,pre_seat ps
  88.       ,pre_seat_index psi
  89.       ,vw_seat_no
  90.       ,(SELECT ROWNUM AS rn FROM DUAL CONNECT BY ROWNUM<=3) vw_seat_type_adj
  91. WHERE psi.train_no=tr.train_no AND psi.item=tr.item AND tr.jobday BETWEEN psi.beg_date AND psi.end_date AND psi.flag=0
  92.        AND ps.pre_id = tr.train_no||':'||tr.item||':'||TO_CHAR(psi.beg_date,'YYYYMMDD')
  93.        AND tr.sequence = ps.beg_station   -- 和无号不同
  94.        AND vw_seat_no.seat_no BETWEEN ps.beg_seatno AND ps.end_seatno
  95.        AND (ps.seat_type=20       --- 硬卧,连接三行
  96.             OR ps.seat_type <>20 AND vw_seat_type_adj.rn = 1   -- 非硬卧,只连接一行
  97.            )
  98. /

  99. CREATE OR REPLACE VIEW vw_new_seat
  100. AS
  101. SELECT * FROM vw_seat v
  102. WHERE NOT EXISTS (SELECT 1 FROM seat s
  103.                     WHERE s.start_date  = v.start_date  
  104.                           AND s.beg_station = v.beg_station
  105.                           AND s.Train_no    = v.Train_no   
  106.                           AND s.Carno       = v.Carno      
  107.                           AND s.seat_no     = v.seat_no     
  108.                           AND s.seat_type   = v.seat_type   
  109.                   )
  110. /

  111. --- 建立存储过程生成席位:
  112. CREATE OR REPLACE PROCEDURE make_seats (
  113.           p_train_no     IN VARCHAR2 DEFAULT NULL
  114.          ,p_dflg         IN NUMBER    DEFAULT 0    ---- 如果1则不用TRAINS里面的偏移量      
  115.          ,p_offset_days  IN NUMBER    DEFAULT 0    ---- 缺省当天则偏移为0, +1为第二天
  116.          ,p_created_days IN NUMBER    DEFAULT 1    ---- 缺省一天
  117.          )
  118. AS
  119.    lv_timestamp DATE := SYSDATE;
  120. BEGIN
  121.    INSERT INTO seat_parameter (    -- 参数表
  122.           dflg            -- 控制JOBDAY的计算
  123.          ,start_date      -- today
  124.          ,end_date        -- 如果非空,则可以生成多天的数据
  125.          ,train_no        -- 如果为0或NULL则忽略
  126.           )
  127.    VALUES(p_dflg        
  128.          ,TRUNC(SYSDATE)+p_offset_days  
  129.          ,TRUNC(SYSDATE)+p_offset_days + p_created_days -1
  130.          ,p_train_no   
  131.          );


  132.    INSERT INTO seat (
  133.           train_no               
  134.          ,gride            -- grade?      
  135.          ,end_station            
  136.          ,start_date            
  137.          ,carno                  
  138.          ,purpose               
  139.          ,seat_type              
  140.          ,shortest_station      
  141.          ,flag                  
  142.          ,beg_station            
  143.          ,on_date               
  144.          ,run_train              
  145.          ,pro                    
  146.          ,seat_no               
  147.          ,used_time              
  148.          ,used_dev               
  149.          ,used_uid               
  150.          )
  151.    SELECT train_no               
  152.          ,gride            
  153.          ,end_station            
  154.          ,start_date            
  155.          ,carno                  
  156.          ,purpose               
  157.          ,seat_type              
  158.          ,shortest_station      
  159.          ,flag                  
  160.          ,beg_station            
  161.          ,on_date               
  162.          ,run_train              
  163.          ,pro                    
  164.          ,seat_no               
  165.          ,lv_timestamp AS used_time              
  166.          ,'xwfb' AS used_dev               
  167.          ,'xwfb' AS used_uid               
  168.      FROM vw_new_seat;

  169.    MERGE INTO pre_seat_index psi
  170.    USING (SELECT DISTINCT psi.ROWID rid
  171.             FROM pre_seat_index psi
  172.                 ,vw_train tr
  173.            WHERE psi.train_no=tr.train_no AND psi.item=tr.item AND tr.jobday BETWEEN psi.beg_date AND psi.end_date AND psi.flag=0
  174.          ) n
  175.    ON (n.rid = psi.ROWID)
  176.    WHEN MATCHED THEN UPDATE
  177.         SET psi.distribute_time = lv_timestamp;

  178.    COMMIT;

  179. END make_seats;
  180. /
  181. SHOW ERROR PROCEDURE make_seats;

复制代码

我也有大半年没弄这个了,当初你的程序略慢,大约20%吧,不是根本性的,我也没否定你的方案,将来还真没准用。
大家看看27页我的程序和这个,哪个好懂,业务逻辑如有改变,哪个好变?

[ 本帖最后由 yulihua49 于 2009-12-1 09:44 编辑 ]

使用道具 举报

回复
论坛徽章:
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
448#
发表于 2009-12-1 09:57 | 只看该作者

回复 #456 yulihua49 的帖子

都不好懂都不好变

密密麻麻的

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
449#
发表于 2009-12-1 10:05 | 只看该作者
那时候也不见你出来宣布获胜?我还一直在等你的结果呢。
现在就有劳你再把环境设出来,我已经全丢了,你要把建表语句、测试基础数据贴出来。
运行存储过程之前用DBMS_STATS.GATHER_TABLE_STATS把表的统计信息收集一下,这样保证生成的SQL执行计划是最佳的。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
450#
发表于 2009-12-1 10:30 | 只看该作者
原帖由 〇〇 于 2009-12-1 09:57 发表
都不好懂都不好变

密密麻麻的


如果你知道了需求,你自然知道哪个好懂好维护。
当初我也没有需求,硬是从他的程序里读了出来,连我都有点佩服我自己了。

我记得当时对这个设计提出过意见,那个统计表是应该去掉的,也就是说我过程里的MERGE可以拿掉。这东西完全可以用一个VIEW来代替。

使用道具 举报

回复

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

本版积分规则 发表回复

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