執行Oracle游標是C語言開發人員操作Oracle數據庫的重要技能之一。
游標是Oracle數據庫中用來處理和獲取數據的重要工具。在C程序中,當需要獲取Oracle數據庫中的數據時,使用游標可以指定獲取某個表中的某些數據,或者獲取數據庫中多個表中的相關數據。使用游標可以避免一次性獲取大量的數據,從而提高程序的性能。
下面是使用C語言執行Oracle游標的示例代碼:
#include#include #include #include int 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游標的方法,希望對需要進行此類開發的開發人員提供幫助。
上一篇c 解析oracle
下一篇c 插入oracle數據