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

 从网上找的,适合初学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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值