执行SQL语句
在完成对SQL语句的Prepare预准备后,XGCI通过XGCIExecute()函数来执行已经准备好的语句。以Prepare的方式执行SQL语句时,先定义一个全局cursor,生成SQL语句的执行路径及其执行计划,将其挂载到cursor上;当调用准备好的Prepare的执行时,使用call cursor的方式,直接按路径和计划执行。在执行时省略了计划生成和路径规划,直接执行。选择prepare的执行方式可提升应用的执行效率,在大量重复执行某语句时宜选择prepare的方式。
说明:
未进行Prepare的SQL语句执行可直接调用XGCIExecDirect()函数来完成SQL语句的执行。ExecuteDirect是硬解析语句,服务器端每接收一个语句便对其解析一次,选择其执行路径,生成执行计划,执行SQL语句。
下文对以Prepare预准备SQL语句的执行范例进行了示例展示:
预准备执行带参数的SQL语句
/* SQL语句 */ char sqlcmd[] = "insert into rdb_qc_surf_area1 (V12211,V12212,V13023,V01001,V04002) values (:b1,:b2,:b3, :b4 ,:b5) "; /* 分配语句句柄 */ ret=XuguCIHandleAlloc(hddbc,&(hdstmt),HT_STATEMENT ); int clen1,clen2,clen3,clen4,clen5; int rp2; /* 预准备 */ int rs2=XuguCIPrepare(hdstmt,sqlcmd,XuguCI_NTS); int t_areaNum = 50; int t_month = 1; float imax=56.6,imin=23.66,iPrcpttnMax=99.68; /* 按名绑定参数 */ XuguCIBindParamByName(hdstmt,"b1",PARAM_IN,&(imax),4,Xugu_C_FLOAT,&rp2,&clen1,SQL_FLOAT); XuguCIBindParamByName(hdstmt,"b2",PARAM_IN,&(imin),4,Xugu_C_FLOAT,&rp2,&clen2,SQL_FLOAT); XuguCIBindParamByName(hdstmt,"b3",PARAM_IN,&(iPrcpttnMax),4,Xugu_C_FLOAT,&rp2,&clen3,SQL_FLOAT); XuguCIBindParamByName(hdstmt,"b4",PARAM_IN,&t_areaNum,4,Xugu_C_INTEGER,&rp2,&clen4,SQL_INTEGER); XuguCIBindParamByName(hdstmt,"b5",PARAM_IN,&t_month,4,Xugu_C_INTEGER,&rp2,&clen5,SQL_INTEGER); /* 执行SQL语句 */ rs2=XuguCIExecute(hdstmt);
预准备执行不带参数的SQL语句
/* SQL语句 */ char sqlcmd[CMD]; sprintf(sqlcmd,"select V12211 ,V12212 ,V13023 from rdb_qc_surf_area where (V01001=50 and V04002=1)"); /* 分配语句句柄 */ ret= XuguCIHandleAlloc(hddbc,&(hdstmt),HT_STATEMENT ); int clen1,clen2,clen3,clen4,clen5; int rp2; float imax,imin,iPrcpttnMax=0; /* 预准备SQL语句 */ int rs2=XuguCIPrepare(_cur_connp.hdstmt,sqlcmd,XuguCI_NTS); /* 执行SQL语句 */ rs2=XuguCIExecute(_cur_connp.hdstmt); /* 绑定存放结果集的内存地址 */ XuguCIDefineByPos(hdstmt,1,&(imax),4,Xugu_C_FLOAT,&rp,&clen1); XuguCIDefineByPos(hdstmt,2,&(imin),4,Xugu_C_FLOAT,&rp,&clen2); XuguCIDefineByPos(hdstmt,3,&(iPrcpttnMax),4,Xugu_C_FLOAT,&rp,&clen3); /* 获取结果集 */ ret= XuguCIFetch(hdstmt); printf("imax:%f ,imin:%f ,iPrcpttnMAX: %f \n",imax,imin,iPrcpttnMax); /* 重置语句句柄 */ ret=XuguCIFreeStmt(hdstmt,Xugu_RESET);