OCI編程基礎篇(八) 更新和刪除數據
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
上一節(jié)我們看到了插入數據的過程,這一節(jié)看一下怎樣更新和刪除數據庫表中的數據。其實在OCI中INSERT、UPDATE和DELETE都叫做更新操作,就是通過SQL語句對數據庫表中的數據做出了更改。那么更新和刪除表數據,也遵循插入數據時同樣的步驟,我們列出來,再復習一遍。
1. 分配一個SQL語句句柄,OCIHandleAlloc()。
2. 準備SQL語句,OCIStmtPrepare()。
3. 為SQL語句綁定要插入的數據,OCIBindByPos()。
4. 執(zhí)行SQL語句,OCIStmtExecute()。
5. 提交數據庫改變,OCITransCommit()。
用到的OCI函數的原型和參數已經在上一節(jié)中介紹過了,需要時可以回看一下。
更新和刪除數據與插入數據的不同,僅在執(zhí)行的SQL語句文本不同而已。
還以上一節(jié)中創(chuàng)建的表為例,在test_tab中已經插入了一條數據,現在把NAME和ADDR字段的數據都更新成大寫,那么SQL語句為UPDATE test_tab SET NAME='AAAAAAAA', ADDR='BBBBBBBBBBBBBBBBBBBB' WHERE ID=1。刪除這條數據的SQL語句為DELETE FROM test_tab WHERE ID=1。
在OCI中更新的SQL文本為UPDATE test_tab SET NAME=:1, ADDR=:2 WHERE ID=:3。刪除的SQL文本為DELETE FROM test_tab WHERE ID=:1。
不管是更新列表中的占位符還是WHERE條件中的占位符,都要通過綁定函數來與宿主變量建立聯系。下面還是通過實際的例子代碼來看一下完整的過程。
更新數據源代碼。
OCIEnv *envhp = NULL; OCIError *errhp = NULL; OCIServer *svrhp = NULL; OCISession *usrhp = NULL; OCISvcCtx *svchp = NULL; OCIStmt *smthp = NULL; /* 更新一條數據 */ int update_one_row(void){ sword rc; int slen; sb2 ind_id; sb2 ind_name; sb2 ind_addr; ub2 alen_id; ub2 alen_name; ub2 alen_addr; ub2 rcode_id; ub2 rcode_name; ub2 rcode_addr; int32_t id; char name[32]; char addr[256]; OCIBind *bndp; char sqltxt[1024]; /* 分配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, "UPDATE test_tab SET NAME=:1, ADDR=:2 WHERE ID=:3"); slen = strlen(sqltxt); /* 準備語句 */ if (check_oci_error(errhp, OCIStmtPrepare(smthp, errhp, (const OraText *)sqltxt, slen, OCI_NTV_SYNTAX, OCI_DEFAULT)) < 0) return (-1); /* 綁定第一個占位符NAME */ if (check_oci_error(errhp, OCIBindByPos((OCIStmt *)smthp, (OCIBind **)&bndp, errhp, (ub4)1, /* position */ (void *)name, /* valuep */ (sb4)30, /* value_sz */ (ub2)SQLT_STR, /* dty */ (void *)&ind_name, /* indp */ (ub2 *)&alen_name, /* alenp */ (ub2 *)&rcode_name, /* column return code pointer */ (ub4)0, /* maxarr_len */ (ub4 *)NULL, /* curelep */ (ub4)OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 綁定第二個占位符ADDR */ if (check_oci_error(errhp, OCIBindByPos((OCIStmt *)smthp, (OCIBind **)&bndp, errhp, (ub4)2, /* position */ (void *)addr, /* valuep */ (sb4)200, /* value_sz */ (ub2)SQLT_STR, /* dty */ (void *)&ind_addr, /* indp */ (ub2 *)&alen_addr, /* alenp */ (ub2 *)&rcode_addr, /* column return code pointer */ (ub4)0, /* maxarr_len */ (ub4 *)NULL, /* curelep */ (ub4)OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 綁定第三個占位符ID */ if (check_oci_error(errhp, OCIBindByPos((OCIStmt *)smthp, (OCIBind **)&bndp, errhp, (ub4)3, /* position */ (void *)&id, /* valuep */ (sb4)4, /* value_sz */ (ub2)SQLT_INT, /* dty */ (void *)&ind_id, /* indp */ (ub2 *)&alen_id, /* alenp */ (ub2 *)&rcode_id, /* column return code pointer */ (ub4)0, /* maxarr_len */ (ub4 *)NULL, /* curelep */ (ub4)OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 賦值綁定的變量數據 */ strcpy(name, "AAAAAAAA"); strcpy(addr, "BBBBBBBBBBBBBBBBBBBB"); id = 1; /* 指示符賦值為0,輸入非NULL數據 */ ind_name = 0; ind_addr = 0; ind_id = 0; /* 賦值變量的真實數據長度 */ alen_name = strlen(name) + 1; alen_addr = strlen(addr) + 1; alen_id = 4; /* 執(zhí)行OCI語句 */ if (check_oci_error(errhp, OCIStmtExecute(svchp, smthp, /* stmthp */ errhp, /* errhp */ 1, /* iters */ 0, /* rowoff */ NULL, /* snap_in */ NULL, /* snap_out */ OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 提交改變的數據 */ if (check_oci_error(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT)) < 0) return (-1); return (0); }
刪除數據源代碼。
OCIEnv *envhp = NULL; OCIError *errhp = NULL; OCIServer *svrhp = NULL; OCISession *usrhp = NULL; OCISvcCtx *svchp = NULL; OCIStmt *smthp = NULL; /* 刪除一條數據 */ int delete_one_row(void){ sword rc; int slen; sb2 ind_id; ub2 alen_id; ub2 rcode_id; int32_t id; OCIBind *bndp; char sqltxt[1024]; /* 分配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, "DELETE FROM test_tab WHERE ID=:1"); slen = strlen(sqltxt); /* 準備語句 */ if (check_oci_error(errhp, OCIStmtPrepare(smthp, errhp, (const OraText *)sqltxt, slen, OCI_NTV_SYNTAX, OCI_DEFAULT)) < 0) return (-1); /* 綁定第一個占位符ID */ if (check_oci_error(errhp, OCIBindByPos((OCIStmt *)smthp, (OCIBind **)&bndp, errhp, (ub4)1, /* position */ (void *)&id, /* valuep */ (sb4)4, /* value_sz */ (ub2)SQLT_INT, /* dty */ (void *)&ind_id, /* indp */ (ub2 *)&alen_id, /* alenp */ (ub2 *)&rcode_id, /* column return code pointer */ (ub4)0, /* maxarr_len */ (ub4 *)NULL, /* curelep */ (ub4)OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 賦值綁定的變量數據 */ id = 1; /* 指示符賦值為0,輸入非NULL數據 */ ind_id = 0; /* 賦值變量的真實數據長度 */ alen_id = 4; /* 執(zhí)行OCI語句 */ if (check_oci_error(errhp, OCIStmtExecute(svchp, smthp, /* stmthp */ errhp, /* errhp */ 1, /* iters */ 0, /* rowoff */ NULL, /* snap_in */ NULL, /* snap_out */ OCI_DEFAULT) /* mode */ ) < 0) return (-1); /* 提交改變的數據 */ if (check_oci_error(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT)) < 0) return (-1); return (0); }

浙公網安備 33010602011771號