OCI編程高級篇(五) 分片查詢
訪問www.tomcoding.com網(wǎng)站,學(xué)習(xí)Oracle內(nèi)部數(shù)據(jù)結(jié)構(gòu),詳細(xì)文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學(xué)習(xí)高技術(shù)含量的內(nèi)容。
有分片插入的操作,就會有分片查詢的操作,分片插入用OCI_DATA_AT_EXEC模式來綁定輸入變量,分片查詢需要用到OCI_DYNAMIC_FETCH模式來定義輸出變量。分片查詢的步驟如下。
1. 分片OCI語句句柄。
2. 準(zhǔn)備SQL語句,語法分析。
3. 定義輸出變量,輸出變量為空指針,運(yùn)行時再提供緩沖區(qū)。使用OCI_DYNAMIC_FETCH模式。
4. 執(zhí)行查詢語句。
5. 執(zhí)行OCIStmtFetch()函數(shù),這時會返回OCI_NEED_DATA。
6. 執(zhí)行OCIStmtSetPieceInfo()函數(shù),指定接收數(shù)據(jù)的緩沖區(qū)地址和緩沖區(qū)大小。
7. 再執(zhí)行OCIStmtFetch()函數(shù),這時接收緩沖區(qū)中會有返回的數(shù)據(jù),如果沒有后續(xù)的數(shù)據(jù)了,Fetch函數(shù)會返回OCI_SUCESS,整個分片查詢結(jié)束,如果還有剩余數(shù)據(jù),Fetch函數(shù)還會返回OCI_NEED_DATA,這時跳到第6步,繼續(xù)執(zhí)行。
我們把上一次插入的數(shù)據(jù)再讀出來,使用分片查詢的步驟,請看完整的代碼。
OCIEnv *envhp = NULL; OCIError *errhp = NULL; OCIServer *svrhp = NULL; OCISession *usrhp = NULL; OCISvcCtx *svchp = NULL; OCIStmt *smthp = NULL; /* 分片查詢LONG數(shù)據(jù) */ int select_long_piece(void){ sword rc; int slen; sb2 ind_info; ub4 alen_info; ub2 rcode_info; OCIDefine *defp; char sqltxt[1024]; char long_buf[4096]; /* 分配OCI語句句柄 */ rc = OCIHandleAlloc( (void *)envhp, (void **)&smthp, OCI_HTYPE_STMT, 0, (void **)NULL ); if (rc != OCI_SUCCESS) { fprintf(stderr, "OCIHandleAlloc() - allocate statement handle error !\n"); return (-1); } /* 生成SQL語句文本 */ strcpy(sqltxt, "SELECT INFO FROM test_long_tab WHERE ID=1"); slen = strlen(sqltxt); /* 準(zhǔn)備語句 */ if (check_oci_error(errhp, OCIStmtPrepare(smthp, errhp, (const OraText *)sqltxt, slen, OCI_NTV_SYNTAX, OCI_DEFAULT)) < 0) return (-1); /* 定義INFO的輸出變量,使用NULL值,使用OCI_DYNAMIC_FETCH模式, * value_sz要設(shè)置成讀取數(shù)據(jù)的最大值 */ if (check_oci_error(errhp, OCIDefineByPos((OCIStmt *)smthp, (OCIDefine **)&defp, errhp, (ub4)1, /* position */ (void *)NULL, /* valuep */ (sb4)0x7FFFFFFF, /* value_sz */ (ub2)SQLT_LNG, /* dty */ (void *)NULL, /* indp */ (ub2 *)NULL, /* alenp */ (ub2 *)NULL, /* column return code pointer */ (ub4)0, /* maxarr_len */ (ub4 *)NULL, /* curelep */ (ub4)OCI_DYNAMIC_FETCH) ) < 0) return (-1); /* 執(zhí)行OCI語句 */ if (check_oci_error(errhp, OCIStmtExecute(svchp, smthp, /* stmthp */ errhp, /* errhp */ 0, /* iters */ 0, /* rowoff */ NULL, /* snap_in */ NULL, /* snap_out */ OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 循環(huán)處理獲取的數(shù)據(jù),在這里為了方便,只把數(shù)據(jù)長度打印出來 */ while (1) { if ((rc = check_oci_error(errhp, OCIStmtFetch(smthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT))) < 0) return (-1); if (rc == OCI_SUCCESS) { /* 返回數(shù)據(jù)完畢,退出循環(huán),注意這里還有數(shù)據(jù),要處理掉 */ fprintf(stdout, "data actual length: %d\n", alen_info); break; } if (rc != OCI_NEED_DATA) { fprintf(stderr, "data fetch not completed !\n"); return (-1); } /* 處理數(shù)據(jù) */ fprintf(stdout, "data actual length: %d\n", alen_info); /* 設(shè)置數(shù)據(jù)片信息,alen_info設(shè)置一次返回的最大數(shù)據(jù)量 */ alen_info = 4000; if (check_oci_error(errhp, OCIStmtSetPieceInfo((void *)defp, OCI_HTYPE_DEFINE, errhp, (const void *)long_buf, &alen_info, OCI_ONE_PIECE, (const void *)&ind_info, &rcode_info) ) < 0) return (-1); } return (0); }
學(xué)習(xí)Oracle高級知識,編寫高質(zhì)量代碼,盡在www.tomcoding.com

浙公網(wǎng)安備 33010602011771號