|
原帖由 yulihua49 于 2009-1-23 10:07 发表 ![]()
这样行了吧:
JSON_OBJECT get_shift(T_SQL_Connect *SQL_Connect,char *msg)
{
int ret;
DAU u_DAU[2],tdev_DAU;
JSON_OBJECT result,json;
T_PkgType tdev_tpl[2]; //想选几个字段n+1
result=json_object_new_array();
ret=DAU_init(&tdev_DAU,SQL_Connect,"tuxdev",0,0);
partt_copy(tdev_tpl,tdev_DAU.srm.tp,"devname"); //生成子模板,想选几个字段用,分割列表
ret=DAU_init(&u_DAU[0],SQL_Connect,"dev_shift a",0,0);
DAU_init(&u_DAU[1],SQL_Connect,"tuxdev b",tdev_DAU.srm.rec,tdev_tpl);
sprintf(msg,"WHERE a.devid=b.devid");
ret=DAU_getm(2,u_DAU,msg,0);
while(!DAU_nextm(2,u_DAU)) {
json=json_object_new_object();
DAU_toJSON(&u_DAU[0],json,0);//user全部打包到json
DAU_toJSON(&u_DAU[1],json,"devname");//组合dev_name到json
json_object_array_add(result,json);//在JSON数组中加入一条记录
}
DAU_freem(2,u_DAU);
DAU_free(&tdev_DAU);
return result;
}
执行结果:
buf=SELECT a.devid,to_char(a.stat_date,'YYYY-MM-DD') stat_date,a.shift_flg,a.shift_code,a.userid,to_char(a.log_time,'YYYY-MM-DD HH24:MI:SS') log_time,a.beg_no,b.devname FROM TICKET.dev_shift a,TICKET.tuxdev b WHERE a.devid=b.devid
result=[ { "devid": "JOLTTEST", "stat_date": "2008-10-20", "shift_flg": "BB", "shift_code": "5", "userid": "hp", "log_time": "2008-10-20 14:44:34", "beg_no": "A0000001", "devname": "JOLT测试终端" }, { "devid": "JOLTTEST1", "stat_date": "2008-11-06", "shift_flg": "AB", "shift_code": "5", "userid": "hww", "log_time": "2008-11-06 16:12:26", "beg_no": "A0000001", "devname": "黄伟伟的JOLT测试终端" }, { "devid": "SP0102002", "stat_date": "2009-01-20", "shift_flg": "DB", "shift_code": "5", "userid": "ylh", "log_time": "2009-01-20 13:54:03", "beg_no": "A0000001", "devname": "售票测试终端2" }, { "devid": "SP0102003", "stat_date": "2008-10-16", "shift_flg": "DB", "shift_code": "5", "userid": "", "log_time": "2008-10-16 10:14:53", "beg_no": "A0000001", "devname": "售票测试终端3" } ]
原想对DAU再做些改进,支持多表连接的bind功能。
结果:
http://tech.it168.com/db/o/2006-06-15/200606151715426.shtml
说ORACLE语句池不支持多表连接的语句:
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用.
可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询.
过去测过自动生成模板的时间,其内部是带bind的多表连接,耗时永远都是4ms,看来是支持了上述说法。如果语句池起作用,应该在1ms左右。
决定对多表连接不进行bind操作了。
[ 本帖最后由 yulihua49 于 2009-6-16 17:52 编辑 ] |
|