Skip to content

执行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);