楼主: yulihua49

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

[复制链接]
论坛徽章:
7
2010数据库技术大会纪念徽章
日期:2010-05-13 09:34:22
281#
发表于 2009-3-7 08:21 | 只看该作者
原帖由 yulihua49 于 2009-3-6 17:15 发表

快速开发,简单一点,就是不写列名。一种思路是界面工具查询数据结构,自动生成列名,然后人工修改。JAVA框架这么做的比较多。
但是遇到像万能加载、卸载这种情况,(我们在三层C/S模型下,向客户端提供通用的增、删、改、查服务,也是这种情况)写程序时不知道表名,这个办法不灵。
还有就是数据结果落地的问题,落在离散变量,肯定不可能通用,JAVA是落在对象,就是所谓ORM,C就只能落在struct里了,就是我这里的SRM。
那些复杂的SQL,绝对是智慧的结晶,任何自动化系统都不可能有这个智慧。所以,自动系统以包装器形式提供是比较可取的,急了就赤膊上阵,脱了包装直接干。
我上边的万能卸载就脱了,直接用___SQL_Fetch().也让大家看到了DAU部分内部结构。如果有个肯定的需求,其内部结构和处理方法可以公开。
如果以引擎形式提供,绕不开,躲不过就比较麻烦。

这个帖子,我想是抛砖引玉,大家在快速开发上动些脑筋,程序程序生成器?引擎?包装?都可以有自己的办法,大家切磋一下,互相借鉴。就怕扔了石头没响。

不写列名能节省一些时间,但还不是我所考虑的快速开发!相反的我认为所有的业务逻辑最后无非就是保存在数据库中!
我目前的思路大概就是如何组织高效简介的SQL为开发任务的80%的工作。
也就是说:如果做一个查询或者统计模块,我的SQL写完了,我的工作也就完成80%了。
我也思考过用代码生成代码的方式,但这对单表的增删改查比较有效,一旦涉及到多张表还是需要手工去写。

我目前有两个想法:
1、webservice定义接口,所有的业务逻辑都封装在服务中。
2、应用程序直接调用数据库的存储过程和视图,将业务逻辑封装在数据库中。

之所以有以上两个想法,我的目的是不管应用程序是什么,都可以适用。你可以是客户端,可以是浏览器,甚至你如何展示结果我都不关心,可以保持业务逻辑的一致性。

想起了MVC,感觉我的想法就是在webservice或者存储过程中实现C,在数据库实现M,V就千变万化了,呵呵!

使用道具 举报

回复
论坛徽章:
7
2010数据库技术大会纪念徽章
日期:2010-05-13 09:34:22
282#
发表于 2009-3-7 08:31 | 只看该作者
原帖由 newkid 于 2009-3-7 03:44 发表

我写下面这个东西也就几分钟,但必须承认查SQLPLUS手册花了十几分钟:(把以下保存为unload.sql)

干吗要写程序?我们有exp,imp,expdp,impdp, 甚至sqlplus的COPY命令,功能和你这个东西完全不是一个等级的。


我对newkid的敬佩肯定是毋庸置疑的!

我再说说我的看法:

你的oracle水平对我来说无疑是难以望其项背的,但不能把你的标准强加给别人,我绝对承认你的思路和方法。但就好像学化学时老师提到的“实验室方法”和“工厂方法”。
你的这些对开发人员要求太高,我认为暂时是无法普及的!如果让开发人员采用这种方式,就需要让他们学习十年的oracle理论才能干活。

我在前年有大约一年的时间负责公司J2EE架构的开发工作。我选用的开发框架必须要满足以下原则:
1、开发速度要保证
2、最终性能要保证
3、维护起来要简单

我现在开始考虑快速开发也必须要满足以上这些原则!

使用道具 举报

回复
论坛徽章:
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
283#
 楼主| 发表于 2009-3-7 09:29 | 只看该作者

回复 #286 newkid 的帖子

首先,佩服newkid,再一次。
停靠站的选取:
根据车次表的jobday和车次读取停靠站, 限制条件还有flag=0.
生成无号席位时还有station_num-1 > sequence,普通席位则加上母表的BEG_STATION作为条件。
停靠站的选取:在这里是一个辅助功能。一个用于发无号,每个站对经过的车有多少超员数。
一个是,母表里BEG_STATION是个数字,是这个车次的第几站(始发站为0),席位中是该站代码,通过STOP_STATION翻译一下。
生成无号席位时还有station_num-1 > sequence?没有这个条件,所有无号下车站都是最远。

SUBSTR(cycle,MOD(jobday-beg_date, cycle)+1,1)  :日期型变量能直接计算?我是变换成整数的JULian类型。

这个母表是:
某一天同时开H6A和H6B(他们都是H6的trainID所谓全车次),某一天不开。
开的这一天是5156,不开的这天是3000多。
H6A是北戴河-石家庄,0:10分开,H6B是秦皇岛到石家庄,23:55开。途中是两天的车,都是H6,始发却是一天。
硬卧上中下,如何发三张的?没看明白。
其他,恕我愚顿,暂时没看懂,慢慢看。
程序有价值,要好好研究。业务逻辑我明白,打死我也写不出这程序。

那个万能的unload,的确高明。但要注意一点,如果数据中有|怎么办?汉字的第二字节是|怎么办?有回车怎么办?NULL是否处理了?
你最后的|没打出来,所以看不出来NULL的处理,应该之后有|的。
这些在我的pack,dispack里都是处理了的,当然也为此付出不少代价。
NLS_DATE_FORMAT='YYYY-MM-DD';这有点不通用,每个字段要求是不同的,我是用了一个PATTERN_COL表记录了每个列的特殊格式要求。你看我那个pre_seat_index数据,当然你也可以这么办,不过程序要复杂一些了。
要注意,seat里的on_date是YYYY-MM-DD HH24:MI,而seat_remant的on_date是YYYY-MM-DD,这有严格要求,我在DAU_copy时自动转换,程序中你看不出来,这就是你批评的玄机,我接受,程序应该注释。另外,DAU_copy的开销非常大,可能达到或超过insert的时间,我可能改为一连串的赋值来代替它。用不用这个东西,看你关心性能还是图省事。


我的程序可以按用户要求各种格式输出,这对你恐怕勉为其难。

[ 本帖最后由 yulihua49 于 2009-3-7 12:46 编辑 ]

使用道具 举报

回复
论坛徽章:
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
284#
发表于 2009-3-7 10:50 | 只看该作者
station_num-1 > sequence 是从这里来的:
                  seat.end_station=train->station_num-1;
                  ...........
                    if(seat.end_station <= stop_station.sequence) {
                        ShowLog(1,"无号:%s: 起止站错 seq=%d,station_num=%d",

ORACLE的日期型可以相减,和JULIAN的结果一样。

硬卧发三张是因为我连接上一个只有三行的小集合:vw_seat_type_adj 结果一行就变三行了。

我现在的数据比你的少,我需要一两行能说明问题的,这样我可以发现连接条件哪里有错。

集合连接和你的嵌套循环原理一样的,但是写法上简洁很多,等你习惯了就会发现其妙处。

那个UNLOAD程序是随便写的了,也不指望它能处理所有情况。TOM写过一个更好的版本。
文本的表现力毕竟是有限的,真要倒数据我不会这么干。

使用道具 举报

回复
论坛徽章:
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
285#
 楼主| 发表于 2009-3-7 10:55 | 只看该作者
原帖由 newkid 于 2009-3-7 10:50 发表
station_num-1 > sequence 是从这里来的:
                  seat.end_station=train->station_num-1;
                  ...........
                    if(seat.end_station  

你好,歇班还在辛勤耕耘?
那只是一个检查,怕数据错误。
item应该是pre_seat_index里的母表组号,一个车次,可能每天配的资源不同,形成不同的母表组,是从车次周期算出来,确定用哪一组母表的。
on_date指上车日期,j=(train)始发时间(分钟数,0-1439。23:55就是1435)+运行分钟数(stop_station)+停靠分钟数。
j/1440=运行天数,j%1440=开车时刻。on_date=jobday+运行天数。在seat里贴上开车时刻,seat_remant不贴时刻。

周一还在外边,回单位后做实验。

[ 本帖最后由 yulihua49 于 2009-3-7 13:16 编辑 ]

使用道具 举报

回复
论坛徽章:
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
286#
 楼主| 发表于 2009-3-7 13:36 | 只看该作者
原帖由 newkid 于 2009-3-7 03:44 发表


干吗要写程序?我们有exp,imp,expdp,impdp, 甚至sqlplus的COPY命令,功能和你这个东西完全不是一个等级的。

双方都在运行中,不允许停止。比方一批席位从一个节点传送到另一个节点,双方都在作业中。数据中会有部分重码等等。
还有一种可能,双方不同数据库。比方现系统是SYBASE,新系统是ORACLE,DAU是完全胜任的。
只要需要,我很快就会把SYBASE和MYSQL,SQL SERVER,DB2的DAU写出来。

其实你跟我叫板,主要还是性能问题,也许,我的程序性能不如你,但要比很多二流程序员好。
你出程序的确很快,但世上这样的高手能有几个?身价几许?能说劳动生产率高吗?你那个程序不长,可是我现在还在迷宫里转呢。我都搞不清什么逻辑了,因为业务逻辑我清楚,那个不清楚的逻辑是什么逻辑我不清楚。
我的DAU程序员,如果对C略有了解,半天功夫就能培训出一大堆来。他们只需要简单的,面向过程的思维,就可以实现任何设计好的业务逻辑。
学10个函数包打天下,什么活都敢接。当然还有一堆utilily ’s,可用可不用。(哈哈,有点卖膏药的味,不过我不收钱,白给)

那个DAU程序,我写了不到400行,如果认真看,一般人1个小时基本能搞懂。(一帮孩子照它写TPF呢,苦阿)。
你的程序100行左右,我,哦别说我这笨人了,找个对PLSQL比较精通的吧,要看几个小时能明白?
原来见过一个ORACLE虫,写一个SQL4小时,调好用一周,经常的。
DAU,4个小时写的,一个小时调通,调对。

[ 本帖最后由 yulihua49 于 2009-3-7 14:17 编辑 ]

使用道具 举报

回复
论坛徽章:
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
287#
 楼主| 发表于 2009-3-7 19:51 | 只看该作者
原帖由 newkid 于 2009-3-7 04:28 发表

而在遥远的其他地方,还有给train_no赋值的代码!strcpy(stop_station.train_no,pre_index->train_no);
你看得出stop_station和cz_DAU是有联系的吗?看得出为了查询一个数据要这么多窍门吗?
明明白白的编程方法:get_stop_station就应该有train_no,sequence,beg_date作为输入参数。根据这些参数查询数据库数据。

早先的DAO的确是那样写。后来认为既然DAU已经有数据了,就夹在数据里走吧,就成了这个样子,其实在前边get_seat_for_sell的参数还是这样的。见仁见智的,喜欢哪一种都可以。新的方法与TPF有相似之处,过去的索引文件系统都是用记录传条件的,数据记录通常是INOUT的。
程序还是没转出来,关键是许多操作不懂,MERGE要先学,nvl原来就似懂非懂,trunc()是什么?等等。view里的数据何时可用?都有些什么?好像是些非过程的东西,拿过程思维老是转不过来。

[ 本帖最后由 yulihua49 于 2009-3-7 20:05 编辑 ]

使用道具 举报

回复
论坛徽章:
4757
季节之章:冬
日期:2019-07-13 22:29:26季节之章:春
日期:2019-07-13 22:29:26季节之章:夏
日期:2019-07-13 22:29:26季节之章:秋
日期:2019-07-13 22:29:26嫦娥
日期:2019-08-03 07:05:29玉石琵琶
日期:2019-08-03 08:17:02铁扇公主
日期:2019-08-03 21:12:36九尾狐狸
日期:2019-08-05 21:05:25玉石琵琶
日期:2019-08-06 06:36:05玉兔
日期:2019-08-06 16:05:50
288#
发表于 2009-3-7 21:12 | 只看该作者
学习。

使用道具 举报

回复
论坛徽章:
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
289#
发表于 2009-3-7 21:31 | 只看该作者
继续关注, 我觉得楼主应该加强Oracle数据库知识的学习, 当你有一些深入的学习后, 也许你现在的一些观点就会完全改变.
(好像楼主说是你们单位数据库知识最强的吧?)

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
290#
发表于 2009-3-7 21:40 | 只看该作者
两位的讨论很精彩
作为我,是偏向强化底层的,喜欢发挥oracle的独特优势
但技术是为市场服务的,因此,能解决用户需求同时又能节约成本的方法不失为一种好方法
只不过,很多数据库包装器都需要不断改进,而这种改进往往就是为了适应各个数据库的特性从而发挥DB的性能

使用道具 举报

回复

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

本版积分规则 发表回复

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