欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

c 執行oracle游標

謝彥文1年前7瀏覽0評論

執行Oracle游標是C語言開發人員操作Oracle數據庫的重要技能之一。

游標是Oracle數據庫中用來處理和獲取數據的重要工具。在C程序中,當需要獲取Oracle數據庫中的數據時,使用游標可以指定獲取某個表中的某些數據,或者獲取數據庫中多個表中的相關數據。使用游標可以避免一次性獲取大量的數據,從而提高程序的性能。

下面是使用C語言執行Oracle游標的示例代碼:

#include#include#include#includeint main() {
OCIEnv *env;
OCISrvCtx *srv;
OCIError *err;
OCISession *ses;
OCISvcCtx *svc;
OCIStmt *stmt;
OCIStmt *stmt1;
OCIDefine *def;
OCIBind *bind;
OCIParam *param;
sword status;
char user[50];
char pass[50];
char dbname[50];
char query[256];
char temp[50];
int id;
int count;
char name[50];
double price;
//初始化OCI環境、服務上下文、錯誤句柄等
OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL);
OCIHandleAlloc(env, (void**)&srv, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(env, (void**)&ses, OCI_HTYPE_SESSION, 0, NULL);
OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL);
OCIHandleAlloc(env, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
OCIHandleAlloc(env, (void**)&stmt1, OCI_HTYPE_STMT, 0, NULL);
//指定數據庫用戶名、密碼、連接字符串
strcpy(user, "scott");
strcpy(pass, "tiger");
strcpy(dbname, "ORCL");
//連接數據庫
OCILogon2(env, err, &svc, user, strlen(user), pass, strlen(pass), dbname, strlen(dbname), OCI_DEFAULT);
//創建游標
sprintf(query, "BEGIN OPEN :1 FOR SELECT * FROM PRODUCTS; END;");
OCIStmtPrepare(stmt1, err, query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svc, stmt1, err, 1, 0, NULL, NULL, OCI_STMT_SCROLLABLE_READONLY);
OCIParamGet(stmt1, OCI_HTYPE_STMT, err, (void**)¶m, 1);
//設置游標
OCIAttrGet(param, OCI_DTYPE_PARAM, (void**)&stmt, 0, OCI_ATTR_CURSOR, err);
sprintf(query, "FETCH :1 INTO :2, :3, :4;");
OCIStmtPrepare(stmt, err, query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
//綁定游標參數
OCIBindByName(stmt, &bind, err, (OraText *) ":1", strlen(":1"), (void *) &id, sizeof(int), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIAttrSet(bind, OCI_HTYPE_BIND, (void*)&def, 0, OCI_ATTR_DEFINE, err);
OCIAttrSet(def, OCI_DTYPE_PARAM, (void*)&count, sizeof(count), OCI_ATTR_DATA_SIZE, err);
//綁定結果集參數
OCIBindByName(stmt, &bind, err, (OraText *) ":2", strlen(":2"), (void *)name, sizeof(name), SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIAttrSet(bind, OCI_HTYPE_BIND, (void*)&def, 0, OCI_ATTR_DEFINE, err);
OCIAttrSet(def, OCI_DTYPE_PARAM, (void*)&count, sizeof(count), OCI_ATTR_DATA_SIZE, err);
OCIBindByName(stmt, &bind, err, (OraText *) ":3", strlen(":3"), (void *) &price, sizeof(double), SQLT_FLT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIAttrSet(bind, OCI_HTYPE_BIND, (void*)&def, 0, OCI_ATTR_DEFINE, err);
OCIAttrSet(def, OCI_DTYPE_PARAM, (void*)&count, sizeof(count), OCI_ATTR_DATA_SIZE, err);
//執行游標
OCIStmtExecute(svc, stmt, err, 0, 0, NULL, NULL, OCI_FETCH_NEXT);
while (status != OCI_NO_DATA) {
printf("Product ID: %d, Product Name: %s, Product Price: %0.2f\n", id, name, price);
status = OCIStmtFetch2(stmt, err, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
}
//關閉游標和數據庫連接
OCIStmtClose(stmt, err);
OCIStmtClose(stmt1, err);
OCILogoff(svc, err);
OCIHandleFree(srv, OCI_HTYPE_SERVER);
OCIHandleFree(err, OCI_HTYPE_ERROR);
OCIHandleFree(ses, OCI_HTYPE_SESSION);
OCIHandleFree(svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(stmt, OCI_HTYPE_STMT);
OCIHandleFree(stmt1, OCI_HTYPE_STMT);
return 0;
}

以上代碼實現了對Oracle數據庫中表 PRODUCTS 的查詢,并且使用游標將查詢結果集返回到C程序中。

代碼執行流程為:初始化OCI環境、服務上下文、錯誤句柄等,指定數據庫用戶名、密碼、連接字符串,連接數據庫,創建游標,設置游標,綁定游標參數與結果集參數,執行游標并輸出結果集,關閉游標和數據庫連接。

以上是使用C語言執行Oracle游標的方法,希望對需要進行此類開發的開發人員提供幫助。