linux下應用oci程式設計示例

2021-06-19 10:28:23 字數 4503 閱讀 8790

本示例程式基於對oci庫方法的簡單的封裝,若要實驗本程式,要求有linux下的oci庫libclntsh.a或libclntsh.so。

下面是對其簡單的封裝:

#include

#include "oratypes.h"

#include "ocidfn.h"

#ifdef __stdc__

#include "ociapr.h"

#else

#include "ocikpr.h"

#endif

#include "ocidem.h"

#define oci_exit_failure 1

#define oci_exit_success 0

#define  defer_parse 

1#define  native 

1#define  version_7 

2void logon(lda_def *lda,ub1 *hda,text *user,text* passwd);

void logon1(lda_def *lda,ub1 *hda,text *user,text* passwd);

void logoff (lda_def *lda,cda_def  *cda_cur);

void opencurs(cda_def *cda_cur,lda_def *lda_cur);

void parsesql(cda_def *cda_cur,text *sqlstmt,lda_def *lda);

void defineintout(cda_def *cda,lda_def *lda,int *out,sword index);

void definetextout(cda_def *cda,lda_def *lda,text *out,sword index,sword size);

void err_report(cda_def  *cursor,lda_def *lda);

void do_exit(eword status);

void close_cursor(cda_def *cda_cur);

void execute_sql(cda_def *cda_cur,lda_def *lda);

void bind_sql(cda_def *cda,text *txt,ub1 *ub,int size,int sql_type,lda_def *lda);

///ocihelper.h實現部分ocihelper.cpp //

#include

#include

#include "ocihelper.h"

void logon(lda_def *lda,ub1 *hda,text *user,text* passwd)

printf("\n connected to oracle as %s\n",user); }

void logon1(lda_def *lda,ub1 *hda,text *user,text* passwd)

printf("\n connected to oracle as %s\n",user); }

void opencurs(cda_def *cda_cur,lda_def *lda_cur)}

void parsesql(cda_def *cda_cur,text *sqlstmt,lda_def *lda) }

void logoff(lda_def *lda,cda_def  *cda_cur)

if (ologof(lda))  

}void close_cursor(cda_def *cda_cur)}

void execute_sql(cda_def *cda_cur,lda_def *lda)}

void do_exit(eword status)

void err_report(cda_def  *cursor,lda_def *lda)

void defineintout(cda_def *cda,lda_def *lda,int *out,sword index)}

void definetextout(cda_def *cda,lda_def *lda,text *out,sword index,sword size)}

void bind_sql(cda_def *cda,text *txt,ub1 *ub,int size,int sql_type,lda_def *lda)}

然後將其打包為庫:在此以兩種方法庫的形式給出,使用方法一樣:都指出庫路徑所在目錄或放在預設目錄下即可

打包為動態鏈結庫:

g++ -o libocihelper.so  -shared -rdynamic -fpic -libclntsh.a

打包為靜態鏈結庫:

g++ -c ocihelper.cpp

ar -rc libocihelper.aocihelper.o libclntsh.a

下面是使用示例,首先定義全域性變數,幷包含標頭檔案ocihelper.h

lda_def lda; 

ub1 hda[hda_size/(sizeof(ub1))]; 

cda_def cda;

1. select序列的值

sword cert_id;

logon( &lda, (ub1*)hda,(text *)"orausr",(text *)"ora123");

opencurs(&cda,&lda);

parsesql(&cda,(text *)"select cert_sequence.nextval from dual",&lda);

defineintout(&cda,&lda,&cert_id, (sword)1);

execute_sql(&cda,&lda);

if(ofetch(&cda) == 0)

close_cursor(&cda);

2.insert錶值

text *insertstmt=(text *)"insert into certlist values(:certid,:userinfo,:inputtime);

char local_time[12];

time_t t;//獲取當前日期

t=time(null);

struct tm *currtime;

currtime=(struct tm*)localtime(&t);

memset(local_time,0,sizeof(local_time));

sprintf((char*)local_time,"%04d-%02d-%02d",1900+currtime->tm_year,1+currtime->tm_mon,currtime->tm_mday);

logon(&lda,(ub1 *)hda,(text *)"orausr",(text *)"ora123");

opencurs(&cda,& lda);

parsesql(&cda,insertstmt,&lda);

bind_sql(&cda,(text *)":certid",(ub1 *)&cert_id,sizeof(cert_id),sqlt_int,&lda);

bind_sql(&cda,(text *)":userinfo",(ub1 *)user_info,strlen(user_info)+1,sqlt_str,&lda);

bind_sql(&cda,(text *)":inputtime",(ub1 *)local_time,strlen(local_time)+1,sqlt_str,&lda);

execute_sql(&cda, &lda);

close_cursor(&cda); 

ologof(&lda);

3.update錶值

text *updatequerystmt=(text*)"update certlist set inputtime=:time where id=:certid";

logon(&lda,(ub1 *)hda,(text *)"orausr",(text *)"ora123");

opencurs(&cda,&lda);

parsesql(&cda,updatequerystmt,&lda); 

bind_sql(&cda,(text *)":certid",(ub1 *)&cert_id,sizeof(cert_id),sqlt_int,&lda);

bind_sql(&cda,(text *)":time",(ub1 *)local_time,sizeof(local_time),sqlt_str,&lda);

execute_sql(&cda, &lda);

close_cursor(&cda);

4.獲取滿足sql條件的記錄條數

void getdatabasecount(text *sqlstmt,sword *count)

*count=count;

if (cda.rc!= no_data_found)

err_report(&cda,&lda);

close_cursor(&cda);}

Linux下的簡單socket程式設計示例

api中用到的結構體 1.struct sockaddrstruct sockaddr sockaddr包含兩部分內容 1.短整型sa family定義了位址家族型別,這個型別會用於socket 函式2.14位元組的sa data陣列預留儲存本身的位址注意 1.原本沒有sa len2.根據sa fa...

linux執行緒程式設計示例

執行緒程式設計和rtos實時任務建立差不多,比程序更節省資源 執行緒標頭檔案 include 函式原型 1.建立執行緒 int pthread create pthread t thread,const pthread attr t attr,void start routine void void...

Linux下程式設計

windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...