OCI编程,我先OCIStmtFetch2,然后OCIParamGet 获取表字段名 然后while (OCIStmtFetch2(stmt_, err_, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT) == OCI_SUCCESS) ,但是while 循环不进去,则非该怎么获取查询结果数据
时间: 2024-02-22 11:57:05 浏览: 131
OCI编程中,使用OCIStmtFetch2函数获取查询结果数据是正确的方式,而使用OCIParamGet函数获取表字段名则需要在OCIStmtExecute函数成功执行后才能调用。
在你的代码中,如果while循环没有进入,可能是因为OCIStmtExecute函数没有成功执行,或者查询结果没有数据。你可以在OCIStmtExecute函数执行后,通过OCIAttrGet函数获取查询结果的行数,从而判断是否有查询结果数据。
以下是一个示例代码,供你参考:
```c
/* 准备SQL语句 */
const char *sql = "SELECT name, age FROM employees";
OCIStmtPrepare2(svchp, &stmtp, errhp, sql, strlen(sql), NULL, 0, OCI_NTV_SYNTAX, OCI_DEFAULT);
/* 执行SQL语句 */
OCIStmtExecute(svchp, stmtp, errhp, 0, 0, NULL, NULL, OCI_DEFAULT);
/* 获取查询结果的行数 */
ub4 num_rows;
OCIAttrGet(stmtp, OCI_HTYPE_STMT, &num_rows, 0, OCI_ATTR_ROW_COUNT, errhp);
if (num_rows > 0) {
/* 获取表字段名 */
OCIParam *param;
OCIParamGet(stmtp, OCI_HTYPE_STMT, errhp, (void **)¶m, 1);
ub4 num_cols;
OCIAttrGet(param, OCI_DTYPE_PARAM, &num_cols, 0, OCI_ATTR_NUM_COLS, errhp);
for (int i = 1; i <= num_cols; i++) {
char col_name[64];
ub4 col_name_len;
OCIParamGet(param, OCI_DTYPE_PARAM, errhp, (void **)¶m, i);
OCIAttrGet(param, OCI_DTYPE_PARAM, &col_name, &col_name_len, OCI_ATTR_NAME, errhp);
printf("%s\t", col_name);
}
printf("\n");
/* 获取查询结果数据 */
while (OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT) == OCI_SUCCESS) {
char name[64];
sb4 age;
OCIAttrGet(stmtp, OCI_HTYPE_STMT, &name, NULL, OCI_ATTR_NAME, errhp);
OCIAttrGet(stmtp, OCI_HTYPE_STMT, &age, NULL, OCI_ATTR_DATA_TYPE, errhp);
printf("%s\t%d\n", name, age);
}
}
```
在上面的代码中,先通过OCIAttrGet函数获取查询结果的行数,然后在num_rows大于0时,通过OCIParamGet函数获取表字段名和字段数,再通过OCIAttrGet函数获取每个字段的名称,最后使用OCIStmtFetch2函数获取查询结果数据。注意,OCIAttrGet函数获取字段名称和字段数时,要传递OCI_DTYPE_PARAM作为第二个参数。
阅读全文