|
回复 #10 yulihua49 的帖子
系统的规模开发已进行了一月余,1个老人,5个新人,培训4小时。
头一周,问题比较多,现在整个团队正常运转,大家使用C、JSON、DAU、TUXEDO都顺利。
系统设计很怪,都使用标号的表名、列名:如:
ASMPP01表,TXPSA001列。。。。。。
DAU提供了列名-伪列名转换机制,在应用程序中使用有意义的伪列名,使开发简化不少。
如:
/*席位余量查询模板*/
T_PkgType seat_remain_tpl[]={
{CH_DATE,YEAR_TO_DAY_LEN,"FSMPS005 on_date",YEAR_TO_DAY,-1}, //上车日期
{CH_CHAR,9,"ADMRP070 trn_no"}, //站车次
{CH_CHAR,6,"FSMPS052 beg_stn"}, //上车站
{CH_CHAR,6,"FSMPS003 end_stn_code"}, //下车站
//{CH_CHAR,11,"null purpose"}, //用途
{CH_CHAR,3,"ABDAP055 seat_type"}, //席别
{CH_SHORT,sizeof(short),"SUM(FSMPS010) quantity"}, //数量
{-1,0,"ASMPS02",0}
};
/*席位余量查询结构体*/
typedef struct{
char on_date[YEAR_TO_DAY_LEN];
char trn_no[9];
char beg_stn[6];
char end_stn_code[6];
// char purpose[11];
char seat_type[3];
short quantity;
}seat_remain_stu;
- DAU_init(&t_DAU,&sql,0,&rem,seat_remain_tpl);
- strcpy(rem.on_date,"2009-09-19");
- strcpy(rem.trn_no,"C2271");
- strcpy(rem.beg_stn,"10010");
- strcpy(rem.end_stn_code,"10172");
- p=DAU_mk_where(&t_DAU,"on_date,trn_no,beg_stn,end_stn_code",stmt);
- p+sprintf(p," GROUP BY $on_date,$trn_no,$beg_stn,$end_stn_code,$seat_type ");
- printf("stmt=%s\n",stmt);
- ret=DAU_select(&t_DAU,stmt,0);
- printf("select ret=%d,stmt=%s\n",ret,stmt);
- if(ret>0) {
- while(!DAU_next(&t_DAU)) {
- DAU_pack(&t_DAU,stmt);
- printf("result=%s\n",stmt);
- }
- }
- DAU_free(&t_DAU);
复制代码
生成的语句及结果:
select ret=2,stmt=SELECT to_char(FSMPS005,'YYYY-MM-DD') on_date,ADMRP070 trn_no,FSMPS052 beg_stn,FSMPS003 end_stn_code,ABDAP055 seat_type,SUM(FSMPS010) quantity FROM TBSDBA.ASMPS02 WHERE FSMPS005=to_date(:1,'YYYY-MM-DD') AND ADMRP070=:2 AND FSMPS052=:3 AND FSMPS003=:4 GROUP BY FSMPS005,ADMRP070,FSMPS052,FSMPS003,ABDAP055
result=2009-09-19|C2271|10010|10172|O|112|
result=2009-09-19|C2271|10010|10172|M|56|
如果没有DAU,你要去写列名列表,变量列表,晕死。
一般情况下 模板是自动生成的,在这个例子里,只有这一列是人工添加的:
{CH_SHORT,sizeof(short),"SUM(FSMPS010) quantity"}, //数量
newkid所说的惯性思维出现了,一些可以联合查询的,大家习惯单表查询,逻辑组合,不过目前没发现效率问题。
DAU使用手册第8节:
8. 复杂SQL语句的应用
DAU允许使用复杂的SQL语句,但仅限于DAU_select和DAU_prepare,并且需要手工建立模板。
支持如下形式的复杂语句:
列值表达式:
在列名字段:"表达式 虚列名"
表达式可以是任何合法的SQL语句,如select语句。在语句中支持bind变量。在表名前可设置属主前缀 $DB. DAU将其替换成数据库属主。
表名表达式:对于普通表名,DAU自动在其前加入数据库属主前缀。复杂表名,通过其含有 空格, DAU不加入数据库属主前缀,需要时在表名前可设置属主前缀 $DB. DAU将其替换成数据库属主。
Where表达式,可以有复杂的子查询,子查询可以使用bind变量,子查询的表名前可设置属主前缀 $DB. 。DAU将其替换成数据库属主。
纯bind变量:列名为:"null 虚列名",仅用于查询前bind查询值,在结果集无意义。
例如,下例涉及3个表:
T_PkgType test_tpl[]={
{CH_DATE,11,"a.beg_date beg_date","YYYY-MM-DD",-1},
{CH_CHAR,11,"b.first_name first_name"},
{CH_CHAR,20,"(select a from $DB.tab3 d where d.b=:last) last"},
{-1,0,"$DB.tab1 a, $DB.tab2 b",0}
};
typedef struct {
char beg_date[11];
char first_name[11];
char last[20];
} test_stu;
DAU_init(&t_DAU,&sql,0,&t,test_tpl);
sprintf(stmt,"where a.first_name=b.first_name and beg_date>:beg_date and a.last_name=(select aa from $DB.tab3 c where c.bb=:first_name) ");
ret=DAU_prepare(&t_DAU,stmt);
生成如下语句:
SELECT to_char(a.beg_date,'YYYY-MM-DD') beg_date,b.first_name first_name,(select a from TICKET.tab3 d where d.b=:1) last FROM TICKET.tab1 a, TICKET.tab2 b where a.first_name=b.first_name and beg_date>to_date(:2,'YYYY-MM-DD') and a.last_name=(select aa from TICKET.tab3 c where c.bb=:3)
[ 本帖最后由 yulihua49 于 2009-9-17 11:10 编辑 ] |
|