oci实例

/**********************************************************

官网:https://www.oceanbase.com/docs/obci/obci/V1.2.1/rcroho

* Copyright(C) 2014 - 2020 Alibaba Inc. All Rights Reserved.

*

*  Filename: example.c

*  Description: ----

*  Create: 2020-07-07 10:14:59

*  Last Modified: 2020-07-07 10:14:59

静态链接:

gcc example.c -I/u01/obclient/include /u01/obclient/lib/libobci.a -L/usr/local/lib64 -lstdc++ -lpthread -ldl -lm -g -o example

动态链接:

gcc example.c  -I/u01/obclient/include -L/u01/obclient/lib/ -L/usr/local/lib64 -lobci -lobclnt -g -o example

***********************************************************/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <malloc.h>

#include "oci.h"

/*声明句柄*/

OCIEnv *envhp;      /*环境句柄*/

OCISvcCtx *svchp;    /*服务环境句柄*/

OCIServer *srvhp;    /*服务器句柄*/

OCISession *authp;  /*会话句柄*/

OCIStmt *stmthp;    /*语句句柄*/

OCIDescribe *dschp;  /*描述句柄*/

OCIError *errhp;    /*错误句柄*/

OCIDefine *defhp[3]; /*定义句柄*/

OCIBind *bidhp[4];  /*绑定句柄*/

sb2 ind[3];          /*指示符变量*/

/*绑定select结果集的参数*/

int szpersonid;    /*存储personid列*/

text szsex[2];      /*存储sex列*/

text szname[10];    /*存储name列*/

text szemail[10];  /*存储mail列*/

char sql[256];      /*存储执行的sql语句*/

static text* SQL_DROP_TB  = (text*)"drop table person";

static text* SQL_CREATE_TB = (text*)"create table person(personid number, sex varchar2(256), name varchar2(256), email varchar2(256))";

void checkerr(OCIError *errhp, sword status, const char* filename, int line) {

  text errbuf[512];

  sb4 errcode = 0;

  switch (status)

  {

  case OCI_SUCCESS:

    break;

  case OCI_SUCCESS_WITH_INFO:

    (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,

                      errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);

    (void) printf("%s:%d Error - OCI_SUCCESS_WITH_INFO now get is %d:%.*s\n", filename, line, errcode, 512, errbuf);

    break;

  case OCI_NEED_DATA:

    (void) printf("%s:%d Error - OCI_NEED_DATA\n", filename, line);

    break;

  case OCI_NO_DATA:

    (void) printf("%s:%d Error - OCI_NODATA\n", filename, line);

    break;

  case OCI_ERROR:

    (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,

                      errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);

    (void) printf("%s:%d Error - now get is %d:%.*s\n", filename, line, errcode, 512, errbuf);

    break;

  case OCI_INVALID_HANDLE:

    (void) printf("%s:%d Error - OCI_INVALID_HANDLE\n", filename, line);

    break;

  case OCI_STILL_EXECUTING:

    (void) printf("%s:%d Error - OCI_STILL_EXECUTE\n", filename, line);

    break;

  case OCI_CONTINUE:

    (void) printf("%s:%d Error - OCI_CONTINUE\n", filename, line);

    break;

  default:

    break;

  }

}

#define OCI_CHECK_RET(errhp, function) \

  checkerr(errhp, function, __FILE__, __LINE__)

/************************************************************************/

/*查询person表*/

/************************************************************************/

void query_tables() {

    sword status = OCI_SUCCESS;

    memset(sql, 0, sizeof(sql));

    strcpy(sql, "select personid, name, email from person");

    /*准备SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT));

    /*绑定输出列*/

    OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[0], errhp, 1, &szpersonid,

                  sizeof(szpersonid), SQLT_INT, &ind[0], 0, 0, OCI_DEFAULT));

    OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1 *)szname,

                  sizeof(szname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT));

    OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1 *)szemail,

                  sizeof(szemail), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT));

    /*执行SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL,

                  OCI_DEFAULT));

    printf("%-10s%-10s%-10s\n", "PERSONID", "NAME", "EMAIL");

    while ((status = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS) {

        printf("%-10d", szpersonid);

        printf("%-10s", szname);

        printf("%-10s\n", szemail);

    }

    if (OCI_NO_DATA != status) {

        printf("error ! error ! error ! err=%d\n", status);

    } else {

        printf("finish fetch data\n");

    }

}

void insert_tables() {

    memset(sql, 0, sizeof(sql));

    strcpy(sql, "insert into person values(:personid,:sex,:name,:email)");

    /*准备SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,

                  OCI_DEFAULT));

    /*绑定输入列*/

    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[0], errhp, (const OraText*)":personid", 9, &szpersonid,

                  sizeof(szpersonid), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0));

    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[1], errhp, (const OraText*)":sex", 4, szsex,

                  sizeof(szsex), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));

    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[2], errhp, (const OraText*)":name", 5, szname,

                  sizeof(szname), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));

    OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[3], errhp, (const OraText*)":email", 6, szemail,

                  sizeof(szemail), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));

    /*设置输入参数*/

    szpersonid = 1;

    memset(szsex, 0, sizeof(szsex));

    strcpy((char*)szsex, "M");

    memset(szname, 0, sizeof(szname));

    strcpy((char*)szname, "obtest");

    memset(szemail, 0, sizeof(szemail));

    strcpy((char*)szemail, "t@ob.com");


    /*执行SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));

    /*提交到数据库*/

    OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));

    while ((OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS) {

        printf("%-10d", szpersonid);

        printf("%-10s", szsex);

        printf("%-10s", szname);

        printf("%-10s\n", szemail);

    }

    printf("finish insert tables\n");

}

void update_tables() {

    memset(sql, 0, sizeof(sql));

    strcpy(sql, "update person set sex='M',name='test',email='test@mail' WHERE personid=1");

    /*准备SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,

                  OCI_DEFAULT));

    /*执行SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));

    /*提交到数据库*/

    OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));

}

void delete_tables() {

    memset(sql, 0, sizeof(sql));

    strcpy(sql, "delete from person WHERE personid = :personid");

    /*准备SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,

                  OCI_DEFAULT));

    /*绑定输入参数*/

    szpersonid = 1;

    OCI_CHECK_RET(errhp, OCIBindByPos(stmthp, &bidhp[0], errhp, 1, &szpersonid,

                sizeof(szpersonid), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0));

    /*执行SQL语句*/

    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));

    /*提交到数据库*/

    OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));

}

int main(int argc, char *argv[]) {

    char strServerName[50];

    char strUserName[50];

    char strPassword[50];

    /*根据实际,设置服务器,用户名和密码*/

    strcpy(strServerName, "192.160.0.1/test");

    strcpy(strUserName, "test");

    strcpy(strPassword, "test");

    /*初始化OCI应用环境*/

    OCI_CHECK_RET(errhp, OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL));

    /*初始化环境句柄*/

    OCI_CHECK_RET(errhp, OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0));

    /*分配句柄*/

    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, 0, 0));

    /*服务器环境句柄*/

    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, 0));

    /*服务器句柄*/

    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&authp, OCI_HTYPE_SESSION, 0, 0));

    /*会话句柄*/

    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, 0));

    /*错误句柄*/

    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&dschp, OCI_HTYPE_DESCRIBE, 0, 0));

    /*描述符句柄*/

    /*连接服务器*/

    OCI_CHECK_RET(errhp, OCIServerAttach(srvhp, errhp, (text *)strServerName,

                    (sb4)strlen(strServerName), OCI_DEFAULT));

    /*设置用户名和密码*/

    OCI_CHECK_RET(errhp, OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strUserName,

              (ub4)strlen(strUserName), OCI_ATTR_USERNAME, errhp));

    OCI_CHECK_RET(errhp, OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strPassword,

              (ub4)strlen(strPassword), OCI_ATTR_PASSWORD, errhp));

    /*设置服务器环境句柄属性*/

    OCI_CHECK_RET(errhp, OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,

              (dvoid *)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp));

    OCI_CHECK_RET(errhp, OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)authp,

              0, OCI_ATTR_SESSION, errhp));

    /*创建并开始一个用户会话*/

    OCI_CHECK_RET(errhp, OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT));

    OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, 0));

    /*语句句柄*/

    /************************************************************************/

    /*创建person表*/

    /************************************************************************/

    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text*)SQL_DROP_TB, strlen((char *)SQL_DROP_TB), OCI_NTV_SYNTAX, OCI_DEFAULT));

    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_COMMIT_ON_SUCCESS));

    OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, SQL_CREATE_TB, strlen((char *)SQL_CREATE_TB), OCI_NTV_SYNTAX, OCI_DEFAULT));

    OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT));

    /************************************************************************/

    /*查询person表*/

    /************************************************************************/

    query_tables();


    /************************************************************************/

    /*向person表插入一条数据*/

    /************************************************************************/

    insert_tables();

    query_tables();


    /************************************************************************/

    /*更新person表*/

    /************************************************************************/

    update_tables();

    query_tables();


    /************************************************************************/

    /*删除person表的ID为的数据,首先要在数据库中存在这条记录*/

    /************************************************************************/

    delete_tables();

    query_tables();

    /************************************************************************/

    /*结束释放资源*/

    /************************************************************************/

    //结束会话

    OCI_CHECK_RET(errhp, OCISessionEnd(svchp, errhp, authp, (ub4)0));

    //断开与数据库的连接

    OCI_CHECK_RET(errhp, OCIServerDetach(srvhp, errhp, OCI_DEFAULT));

    //释放OCI句柄

    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)dschp, OCI_HTYPE_DESCRIBE));

    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)stmthp, OCI_HTYPE_STMT));

    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR));

    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)authp, OCI_HTYPE_SESSION));

    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX));

    OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)srvhp, OCI_HTYPE_SERVER));

    return 0;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容