|
原帖由 newkid 于 2010-3-2 23:56 发表 ![]()
"处理业务时知道结构就足够了,存取时没必要点名,对着百十来个列名,一看就头大。"
我们的"处理业务"做法是不一样的。你们C程序员的思路:读取数据,处理,写回去;
PLSQL程序员的思路:一个SQL搞定。
比如生成一条交易记录我会这么写:
INSERT INTO TRANSACTIONS (TXN_ID,TXN_TIME,CUSTOMER_ID,ITEM_ID,PRICE,QTY,AMOUNT)
SELECT SEQ_TXN.NEXTVAL,SYSDATE,P_CUSTOMER_ID,P_ITEM_ID,PRICE,PRICE*P_QTY - DISCOUNT)
FROM ITEMS
WHERE ITEM_ID = P_ITEM_ID
这里面包含了读,写,和所有的处理。你清楚地看到它们的关系。
我看不出为什么不能用一个二维数组来存放数据?你490楼写了一堆OCI_BindString然后说速度不快,我说可以用数组绑定,不必一行一行地逐个绑定。
你要我写出来咱可没办法,再给你GOOGLE个例子:
你可以写一个通用的,先解析数据结构,再循环调用obndra. 当然没那么容易,我只是说可以不用结构。
"根据传送标志卸载并重新标记传送标志。加载时如果遇到重码,以时间戳新的为准。这个简单逻辑你用系统方法给我实现一个。
这用DAU实现很容易。一般都是定时卸载,按需要分发到其他节点。"
我轻而易举用MATERIALIZED VIEW就给你实现了,一行代码也不写。
既然说到时间戳,我且来考考你,这就叫做抬杠不忘布道。你是如何判断增量修改的?
一般人做法:
1.本次刷新时间=系统当前时间
2.SELECT * FROM 源表 WHERE 时间戳>=上次刷新时间
3.把步骤2结果写入目标
你也是这么做的吗?这里面的漏洞看出来没有?
那是个很老的ORACLE7的oci的成组绑定。还是那个问题,个别行的错误是如何定位和处理的?如果:E[2]、[4]、[6]是NULL怎么办?DAU处理成组非常容易,增加一个记录数量就可以了,因为解决不了上述问题才没有做。
另外,那个demo不通用。如果编程时不知表结构呢?运行时才告你,到时候百十来个列你怎么办?
一大堆数组,不是二维数组,因为每个数组类型不同,根本没有存放规则,运行时无法映射,还是要用结构,结构数组。
结构不仅是按名访问成员,更重要的是集合数据形成数据记录,以便数据存取、通信、和在函数间传递。
恰恰是这个最重要的数据存取功能,过去在文件系统时代很合用,到数据库时代傻眼了。DAU恢复了这个功能。
增量修改:如果在局域网内,同数据库,可以考虑复制服务。如果节点远程分布,不一定在线,那么:
需要卸载时间戳,卸载时间戳要改回原表,对比修改时间戳和卸载时间戳。如果多个目标需要数据就乱了。所以我不会直接写新表。
在多目标的情况,由一个任务先卸载原表并更新状态。所有目标读卸载文件加载自己的库。加载可能不按次序或重复,以修改时间戳最新为准。
一个大的系统这种表很多,你不会一个表一个程序的写吧?
别的没看出来,请指教。
char P_ITEM_ID[10];
T_PkgType P_ITEM_tpl[]={
{CH_CHAR,10,"P_ITEM_ID",0,-1},
{-1,0,"ITEMS",0}
};
DAU dau;
char stmt[4096];
int ret;
DAU_init(&dau,SQL_Connect,0,P_ITEM_ID,&P_ITEM_tpl);
strcpy(P_ITEM_tpl,"abcde");
sprintf(stmt,"INSERT INTO $DB.TRANSACTIONS (TXN_ID,TXN_TIME,CUSTOMER_ID,ITEM_ID,PRICE,QTY,AMOUNT)
SELECT SEQ_TXN.NEXTVAL,SYSDATE,P_CUSTOMER_ID,P_ITEM_ID,PRICE,PRICE*P_QTY - DISCOUNT) FROM $DB.ITEMS WHERE ITEM_ID = :P_ITEM_ID");
ret=DAU_exec(&dau,stmt);
补充一点,在表名前我加了$DB.符号,在安全数据库里可能使用其他用户的表,DAU自动帮你处理属主问题,将来有或者没有属主前缀,通过配置文件决定,程序不要改。
DAU内部替换或删除这个符号。
当然也可以调用sqlora直接做:
定义游标-sqlo_prepare-bind-sqlo_execute- sqlo_prows
比DAU费事。
如果调用存储过程,DAU也不太费事,sqlora比较费事,in,out,inout,返回游标都要处理。
总之,DAU是在OCI和sqlora的基础上简化操作,并提供通用化的手段。
[ 本帖最后由 yulihua49 于 2010-3-3 14:04 编辑 ] |
|