VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

执行SQL语句并处理结果

向数据库发出执行SQL的请求时,需要使用语句句柄,并调用SQLExecDirect或SQLExecute发出查询,服务端执行完成后查询的结果将保存在语句句柄中。

执行查询

调用DCIAllocHandle()函数获取语句句柄,使用DCIStmtPrepare预编译语句,使用DCIDefineByPos绑定缓冲区,然后调用SQLExecute执行查询,最后调用DCIStmtFetch获取结果集。

DCIStmt *stmthp; //语句句柄
text *sqlstmt=(text *)"select C1 from T2";
if(DCIHandleAlloc ((dvoid *) envhp, (dvoid **) &errhp, DCI_HTYPE_ERROR,
             (size_t) 0, (dvoid **) 0))
{
    printf("FAILED: DCIHandleAlloc()\n");         
    return DCI_ERROR
}
int *c1 = (int *) malloc (sizeof(int) * GET_ROWS);
DCIDefine *bndhp[0];
ub4 stmrow, stmrowEx;
DCIParam* colhd = NULL;
int i;
i = '+';
memset(c1, 0, sizeof(int) * GET_ROWS);
/*执行语句*/
DCIStmtPrepare(stmthp, errhp, sqlstmt, strlen((char *)sqlstmt), DCI_NTV_SYNTAX, 0);

if(DCIStmtExecute(svchp, stmthp, errhp, 0, 0, 0, 0, 0))
{
    printf(“FAILED: DCIStmtExecute()\n");
}

/*绑定缓冲区到相对应的列上*/
if(DCIDefineByPos(stmthp, &bndhp[0], errhp, 1
(dvoid *)c1, (sb4)sizeof(int), (ub2)SQLT_INT,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)DCI_DEFAULT))
{
    printf("FAILED: DCIDefineByPos()\n");
    return DCI_ERROR;
}
if (DCIDefineArrayOfStruct(bndhp[0], errhp, sizeof(int), 0, 0, 0))
{
    printf("FAILED: DCIDefineArrayOfStruct ()\n");
    return DCI_ERROR;
}
/*获取结果*/
If(DCIStmtFetch(stmthp, errhp, GET_ROWS, DCI_FETCH_NEXT, 0))
{
    printf("FAILED: DCIStmtFetch ()\n");
    return DCI_ERROR;
}

执行更新

要更改数据(执行一个insert,update或者delete),可以使用bind的方式绑定参数后再执行。

插入

DCIStmt *stmthp; //语句句柄
text *sqlstmt=(text *)”insert into T2(C1) values(:a)”;
if(DCIHandleAlloc ((dvoid *) envhp, (dvoid **) &errhp, DCI_HTYPE_ERROR,
             (size_t) 0, (dvoid **) 0))
{
    printf("FAILED: DCIHandleAlloc()\n");         
    return DCI_ERROR
}
int custno = 9;

DCIStmtPrepare(stmthp, errhp, sqlstmt, strlen((char *)sqlstmt), DCI_NTV_SYNTAX, 0);

if(DCIBindByName(stmthp, &bnd1p, errhp, (text *) “:a”,
        (sb4) -1, (dvoid *) &custno,
        (sb4) sizeof(int), SQLT_INT,
        (dvoid *) 0, (ub2 *)0, (ub2 *)0, (ub4) 0, (ub4 *) 0,
        (ub4) DCI_DEFAULT))
{
    printf(“FAILED: DCIBindByName()\n”);
    return DCI_ERROR;
}

if(DCIStmtExecute(svchp, stmthp, errhp, 0, 0, 0, 0, 0))
{
    printf(“FAILED: DCIStmtExecute()\n”);
}