您的位置:首页 > 数据库 > Oracle

linux下用C编写的OCI连接Oracle数据库程序2

2009-11-28 16:15 531 查看
从网上找的,适合初学OCI编程者 数据库用上一篇文章中的

主程序myoci.c:

/*
gcc -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -I${ORACLE_HOME}/rdbms/public -I${ORACLE_HOME}/rdbms/demo -L${ORACLE_HOME}/lib -lclntsh -o myoci myoci.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "myoci.h"

char USER[31];
char PASS_WORD[31];
char SERVERNAME[31];

#define NUM 100

main(){
/*--- initialize ---*/
OCIDATA data;

char strSql[] = "select * from employees";
char out1[NUM];//output num 1 column
char out2[NUM];//output num 2 column
char out3[NUM];//output num 3 column
char out4[NUM];
sword re;//return param

strcpy(USER,"scott");
strcpy(PASS_WORD,"tiger");
strcpy(SERVERNAME,"orcl");

/*--- get data from oracle database ---*/
ociCreatEvnHandle(&data);//initialize handle
ociLogon(&data, USER, PASS_WORD, SERVERNAME);//logon database
ociStmtPrepare(&data, strSql);//prepare sql

/*--- bind data from database ---*/
ociDefineByPos(&data, 1, out1, SQLT_CHR);//bind mum 1 column
ociDefineByPos(&data, 2, out2, SQLT_CHR);//bind num 2 column
ociDefineByPos(&data, 3, out3, SQLT_CHR);//bind num 3 column
ociDefineByPos(&data, 4, out4, SQLT_CHR);//bind num 3 column

/*--- initialize output array---*/
memset(out1,0,100);
memset(out2,0,100);
memset(out3,0,100);
memset(out4,0,100);

/*--- execute sql ---*/
re = ociStmtExecute(&data);

/*--- output data from database ---*/
while(re != OCI_NO_DATA){
// printf("%s/n", out1);
printf("%s %s %s %s/n", out1, out2, out3,out4);
re = ociStmtFetch(&data);
}

/*--- logout and release handles ---*/
ociHandleFree(&data);
}

头文件myoci.h:

#if !defined( _MYOCIYANGZHI_)
#define _MYOCIYANGZHI_

#include <oci.h>

#define OK 1
#define ERROR 0

/*--- define OCI handle struct---*/
typedef struct{
OCIEnv *p_env;
OCIError *p_err;
OCISvcCtx *p_svc;
OCIStmt *p_sql;
OCIDefine *p_dfn;
OCIBind *p_bnd;
}OCIDATA;

/*--- output error information ---*/
void error_proc(dvoid *errhp, sword status)
{
text errbuf[512];
sb4 errcode;
switch (status)
{
case OCI_SUCCESS:
// printf("OCI_SUCCESS/n");
break;
case OCI_SUCCESS_WITH_INFO:
printf("OCI error: OCI_SUCCESS_WITH_INFO/n");
break;
case OCI_NEED_DATA:
printf("OCI error: OCI_NEED_DATA/n");
break;
case OCI_NO_DATA:
printf("OCI error: OCI_NO_DATA/n");
break;
case OCI_ERROR:
(void)OCIErrorGet((dvoid *)errhp,(ub4)1,NULL,&errcode,
errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);
printf("....%d/n.....%s/n",errcode,errbuf);
break;
case OCI_INVALID_HANDLE:
printf("OCI error: OCI_INVALID_HANDLE/n");
break;
case OCI_STILL_EXECUTING:
printf("OCI error: OCI_STILL_EXECUTING/n");
break;
default:
break;
}
}

/*--- create env and initialize OCI handle ---*/
void ociCreatEvnHandle(OCIDATA *data){
sword re;
//......
re = OCIEnvCreate(&(data->p_env),OCI_DEFAULT,(dvoid *)0,
0,0,0,0,(dvoid **)0);
//......
re = OCIHandleAlloc((dvoid *)data->p_env, (dvoid **)&(data->p_err),
OCI_HTYPE_ERROR,0,(dvoid **)0);
if(re != 0)
printf("creation fail!");
error_proc(data->p_err, OCIHandleAlloc((dvoid *)data->p_env,
(dvoid **)&(data->p_svc), OCI_HTYPE_SVCCTX, 0, 0));
}
/*--- logon oracle database ---*/
void ociLogon(OCIDATA *data, char *user, char *pwd, char *servername){
sword status;
status = OCILogon(data->p_env, data->p_err,
&(data->p_svc), user,
(ub4) strlen((char *)user), pwd,
(ub4)strlen((char *)pwd),
servername, (ub4)strlen((char *)servername));
if (status==OCI_SUCCESS)
printf("connection success!/n");
else {
printf("....connect fail!/n");
printf("-----ORA_search,ERROR in OCILogon-----/n");
error_proc(data->p_err,status);
}
}

/*--- prepare sql ---*/
void ociStmtPrepare(OCIDATA *data, char *strSql){
error_proc(data->p_err, OCIHandleAlloc((dvoid *)data->p_env,
(dvoid **)&(data->p_sql), OCI_HTYPE_STMT, 0, 0));
error_proc(data->p_err, OCIStmtPrepare(data->p_sql, data->p_err, strSql,
(ub4) strlen((char *)strSql), (ub4) OCI_NTV_SYNTAX,
(ub4) OCI_DEFAULT));
}

/*--- bind data on array from database ---*/
void ociDefineByPos(OCIDATA *data, int pos, char *out, ub2 type){
error_proc(data->p_err, OCIDefineByPos(data->p_sql, &(data->p_dfn),
data->p_err, pos, (dvoid *) out, (sword)20,
type, (dvoid *) 0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT));

}

/*--- execute sql ---*/
sword ociStmtExecute(OCIDATA *data){
sword status;
if ((status=OCIStmtExecute(data->p_svc, data->p_sql,
data->p_err, (ub4) 0, (ub4) 0,(CONST OCISnapshot *) NULL,
(OCISnapshot *) NULL, OCI_DEFAULT))
&& status != OCI_SUCCESS_WITH_INFO)
{ //.....
error_proc(data->p_err,status);
printf("-----ORA_search,ERROR in OCIStmtExecute-----/n");
return ERROR;
}
return status;
}

/*--- fetch data until output finish ---*/
sword ociStmtFetch(OCIDATA *data){
sword re;
re = OCIStmtFetch(data->p_sql, data->p_err, 1, 0, 0);
return re;
}

/*--- logoff and release handles ---*/
void ociHandleFree(OCIDATA *data){
OCILogoff(data->p_svc, data->p_err);
OCIHandleFree(data->p_sql, OCI_HTYPE_STMT); // Free handles
OCIHandleFree(data->p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(data->p_err, OCI_HTYPE_ERROR);
}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: