OCI讀取單條記錄 C

2022-02-27 04:30:59 字數 3729 閱讀 5640

開發環境:fedora12 + oracle-client11 + eclipse

目標資料庫:oracle10g

一、準備

1. 建表

create table testtable_oci

( sid int primary key,

seq varchar2(10),

uname varchar2(20),

introduce varchar2(2000),

intime date default sysdate

)-- create sequence

create sequence testtable_ociseq

minvalue 1

maxvalue 9999999999999999999999

start with 1

increment by 1

cache 20

cycle;

2. 建立儲存過程(插入記錄)

create or replace procedure proc_oci_insert

is curid int;

begin

select testtable_ociseq.nextval into curid from dual;

insert into testtable_oci(sid,seq,uname,introduce) values(curid, 'seq'||curid, 'name'||curid, 'introduce_'||curid);

end;

二、**

#include #include #include #include text *username = (text*)"scott";

text *password = (text*)"scott";

text *servicename = (text*)"orcl";

ocienv *envhp; // 環境控制代碼

ociserver *srvhp; // 伺服器控制代碼

ocisvcctx *svchp; // 服務上下文控制代碼

ocierror *errhp; // 錯誤控制代碼

ocisession *usrhp; // 使用者會話控制代碼

ocistmt *stmthp; // 語句控制代碼

ocibind *bndhp; // 繫結控制代碼

int init_env_handle()

sword status = 0;

if(status = ocihandlealloc((void*)envhp, (void**)&errhp, oci_htype_error, (size_t)0, 0))

if(status = ocihandlealloc((void*)envhp, (void**)&srvhp, oci_htype_server, (size_t)0, 0))

if(status = ocihandlealloc((void*)envhp, (void**)&svchp, oci_htype_svcctx, (size_t)0, 0))

if(status = ocihandlealloc((void*)envhp, (void**)&usrhp, oci_htype_session, (size_t)0, 0))

if(status = ocihandlealloc((void*)envhp, (void**)&stmthp, oci_htype_stmt, (size_t)0, 0))

return 1;

}int connect_server()

// 設定會話屬性

if(status = ociattrset((void*)svchp, oci_htype_svcctx, (void*)srvhp, 0, oci_attr_server, errhp))

if(status = ociattrset((void*)usrhp, oci_htype_session, (void*)username, strlen(username), oci_attr_username, errhp))

if(status = ociattrset((void*)usrhp, oci_htype_session, (void*)password, strlen(password), oci_attr_password, errhp))

// 開始會話

if(status = ocisessionbegin((ocisvcctx*)svchp, errhp, usrhp, oci_cred_rdbms, oci_default))

printf("session begin succssfully!\n");

// 設定會話屬性

if(status = ociattrset((void*)svchp, oci_htype_svcctx, (void*)usrhp, 0, oci_attr_session, errhp))

return 1;

}void cleanup()

int disconnect_server()

// 呼叫package取出結果集並返回

int getresult(ocistmt *stmthp)

; int vsid = 1;

char ch[3][1024] = ;

text sql[1024] = ;

ub4 ub4recordno = 1;

sb4 sb4errorcode;

char serrormsg[1024] = ;

ocidefine *hdefine[2] = ;

sb2 sb2ind[2] = ; // 所選擇的列可能存在null,所以要用指示器變數

sprintf(sql, "%s", "select uname,introduce from testtable_oci where sid=:vsid");

ocistmtprepare(stmthp, errhp, sql, strlen(sql), oci_ntv_syntax, oci_default);

s[1] = ocidefinebypos(stmthp, &hdefine[0], errhp, 1, ch[0], sizeof(ch[0]), sqlt_str, &sb2ind[0], null, null, oci_default);

s[2] = ocidefinebypos(stmthp, &hdefine[1], errhp, 2, ch[1], sizeof(ch[1]), sqlt_str, &sb2ind[1], null, null, oci_default);

for(vsid = 0; vsid < 12; vsid++) // 迴圈繫結第乙個輸入變數以執行不同的sql語句

else if(s[3] == oci_no_data)

else

}return 0;

}int main(void)

cleanup();

} return exit_success;

}

不要忘了新增環境變數(我的oracle客戶端安裝在/opt/oracle/):

讀取文字的一條記錄

有乙個txt檔案,每一行是一條記錄,記錄的每乙個字段之間用tab隔開 用readstring可以把一行讀入乙個緩衝區,我怎麼把單個欄位的值讀出來呢?將每行讀入cstring中,再用cstring的find進入拆分int npos strbufer.find t 0 迴圈提取,結束後再處理檔案的下一行...

單條記錄的啟用和禁用

1 在操作的位置加入如下 段 if tbrand.status 1 禁用 else 啟用 if 2 書寫啟用跟禁用的ajax語句 啟用單條記錄 btn enable loippi click function datatype json cache false,success function me...

關於刪除單條記錄報錯的問題

花了兩個小時去想乙個相當簡單的問題,所有的問題在我看來,在沒解決之前都覺得很難,在真正意義上解決的時候,弄懂報錯的根源就會覺得其實就這麼簡單。1.如果執行程式報錯,那麼第一步就看在哪報的錯,重點就看錯誤的第一條和最後一條關於caust by的語句。2.如果頁面上無錯誤顯示,控制台上也無準確訊息列印 ...