当前位置:  技术问答>linux和unix

linux下利用oci开发oracle的问题?

    来源: 互联网  发布时间:2015-05-31

    本文导语:  回答下面问题中的一个或多个均有分,不够可以再加! 1.oci在什么地方可以下载到? 2.在linux下如何配置oci?(最好有相关文档) 3.linux下用oci开发oracle的相关代码或例子程序。 多谢! | 安装or...

回答下面问题中的一个或多个均有分,不够可以再加!
1.oci在什么地方可以下载到?
2.在linux下如何配置oci?(最好有相关文档)
3.linux下用oci开发oracle的相关代码或例子程序。

多谢!

|
安装oracle后,在$ORACLE_HOME/rdbms/demo目录下有oci.h。这个头文件要包含进来。
编译时要加上这些路径:-L$(ORACLE_HOME)/lib -L$(ORACLE_HOME)/rdbms/lib
好像这些库也是必需的,记不清了:-lclntsh -lrt -lpthread
例子可以在oracle文档中找到,很详细。

|
我给你一个例子,但不是一两句能够说清楚,不要怪我灌水啊◎!
#include 
#include 
#include 
#include  // oci head file


static text *username = (text *) "internal";
static text *password = (text *) "oracle";


static text *insert=(text *) "INSERT INTO dept(deptno, dname, loc)
             VALUES (:1, :2, :LOC)";



static void error_proc(dvoid *errhp,sword status);



static void flush();



void main()
{
  sword status,deptno;
  text *dname, *loc, *cp;
  text buf[3];

  sb4  dnamelen=14;
  sb4  loclen=13;
  sb2  dname_ind, loc_ind;

  OCIEnv *envhp;
  OCIError *errhp;
  OCIServer *srvhp;
  OCISvcCtx *svchp;
  OCISession *authp;
  OCIStmt    *stmthp;


  OCIBind   *bnd1p = (OCIBind *) 0;
  OCIBind   *bnd2p = (OCIBind *) 0;
  OCIBind   *bnd3p = (OCIBind *) 0;
  


  //create OCI enviroment
  OCIEnvCreate(&envhp,OCI_THREADED,(dvoid *)0,(void *(*)()) 0,
    (void *(*)()) 0, (void (*)()) 0, 0,(dvoid **) 0);
  OCIHandleAlloc((dvoid *) envhp,(dvoid **) &errhp, OCI_HTYPE_ERROR,
    (size_t) 0, (dvoid **) 0);
  OCIHandleAlloc((dvoid *) envhp,(dvoid **) &srvhp, OCI_HTYPE_SERVER,
    (size_t) 0, (dvoid **) 0);
  OCIHandleAlloc((dvoid *) envhp,(dvoid **) &svchp, OCI_HTYPE_SVCCTX,
    (size_t) 0, (dvoid **) 0);


  
  // connect to database oradb"
  if (OCIServerAttach(srvhp, errhp, (text *)"oradb", strlen("oradb"), 
    0) == OCI_SUCCESS)
    printf("n it has been success to connect to oradb!n");
  else 
    printf("Connection errorn");


 
  // set attribute
  OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX,(dvoid *)srvhp,(ub4)0,
    OCI_ATTR_SERVER,(OCIError *) errhp);
  OCIHandleAlloc((dvoid *)envhp,(dvoid **)&authp,OCI_HTYPE_SESSION,
    (size_t) 0, (dvoid **) 0); //assessment hp



  // set account used by hp
  OCIAttrSet((dvoid *) authp,OCI_HTYPE_SESSION,username,(ub4)strlen((char *)username),OCI_ATTR_USERNAME,errhp);
  OCIAttrSet((dvoid *) authp,OCI_HTYPE_SESSION,password,(ub4)strlen((char *)password),OCI_ATTR_PASSWORD,errhp);
  
  error_proc(errhp, OCISessionBegin(svchp,errhp,authp,OCI_CRED_RDBMS,(ub4) OCI_DEFAULT));


  OCIAttrSet((dvoid *)svchp,OCI_HTYPE_SVCCTX,authp,(ub4) 0,OCI_ATTR_SESSION,errhp);




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

  

  error_proc(errhp,OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp,
          OCI_HTYPE_STMT, (size_t)dnamelen + 2 + loclen + 2,
  (dvoid **) &dname));


  loc = (text *)(dname + dnamelen + 2);


   
  //prepare and execute SQL statement
 
  
  error_proc(errhp, OCIStmtPrepare(stmthp,errhp,insert,(ub4) strlen((char *) insert),OCI_NTV_SYNTAX,OCI_DEFAULT));

  status = OCIBindByPos(stmthp,&bnd1p,errhp,1, (dvoid *) &deptno, (sword) sizeof(deptno),SQLT_INT,(dvoid *) 0,(ub2 *) 0,(ub2 *) 0,(ub4) 0,(ub4 *) 0,OCI_DEFAULT);

  status |= OCIBindByPos(stmthp,&bnd2p,errhp,2,(dvoid *) &dname, dnamelen + 1,SQLT_STR, &dname_ind, (ub2 *) 0,(ub2 *) 0,(ub4) 0,(ub4 *) 0,OCI_DEFAULT);

  status |= OCIBindByName(stmthp,&bnd3p,errhp,(text *) ":LOC",-1, (dvoid *) loc, loclen+1,SQLT_STR, &loc_ind, (ub2 *) 0,(ub2 *) 0,(ub4) 0,(ub4 *) 0,OCI_DEFAULT);


  if (status){
    error_proc(errhp,status);
    printf("Bind errorn");
    OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);
    exit(-1);
  }


  for (; ;){


    printf("Number(2 bits,ENTER for exit): ");
    fgets(buf, 3, stdin);
    cp = (text *) strchr((char *) buf, 'n');
    if(cp==buf){
      OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);
      exit(0);
    }
    else{
      if (cp) *cp = '';
      else flush();
      deptno = atoi(buf);
    }


    printf("n Name : ");
    fgets(dname,dnamelen =1,stdin);
    cp = (text *) strchr((char *) dname, 'n');
    if(cp==dname){
      dname_ind = -1;
    }
    else{
      if (cp) *cp = '';
      else flush();
     dname_ind=0;
    }


    printf("n Place: ");
    fgets(loc, (int) loclen + 1, stdin);
    cp = (text *) strchr((char *) loc, 'n');
    if(cp==loc){
      loc_ind=-1;
    }
    else{
      loc_ind=0;
      if (cp) *cp = '';
      else flush();
      
    }
   

   if((status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, 
        (ub4) 0, (CONST OCISnapshot *) NULL,(OCISnapshot *) NULL,
       OCI_DEFAULT)) && status != OCI_SUCCESS_WITH_INFO){ 


      error_proc(errhp,status);

 
      printf("Execute errorn");

 
      OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);
      exit(-1);
      }
 





   if(status = OCITransCommit(svchp,errhp,0))
    {
      error_proc(errhp,status);
      OCIHandleFree((dvoid *) envhp,OCI_HTYPE_ENV);
      exit(-1);
    }
 
   else 
     printf("Insertation Success!n");
    


   }
 
 



 // over the dialog
  
 
  
  if (OCISessionEnd(svchp,errhp,authp,OCI_DEFAULT) == OCI_SUCCESS)
    printf("n %s dialog is over !",username);

  // disrupt the connect
  if (OCIServerDetach(srvhp,errhp,OCI_DEFAULT) == OCI_SUCCESS)
    printf("noradb database connect is disrupted!");

  //free all kinds of hp
  OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);  
  




 
}


void flush() {
  char buf[128];
  fgets(buf, 128, stdin);
}

    




  


  //deal with error
  static void error_proc(dvoid *errhp, sword status)
  {
  text errbuf[512];
  sb4 errcode;
  switch (status)
    {
    case OCI_SUCCESS:
      break;
    case OCI_SUCCESS_WITH_INFO:
      (void) printf("OCI ERROR CODE:OCI_SUCCESS_WITH_INFOn");
      break;
    case OCI_NEED_DATA:
      (void) printf("OCI ERROR CODE:OCI_NEED_DATAn");
      break;
    case OCI_NO_DATA:
      (void) printf("OCI ERROR CODE:OCI_NO_DATAn");
      break;
    case OCI_ERROR:
      (void) OCIErrorGet((dvoid *)errhp,(ub4) 1,NULL,&errcode,errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);  
      (void) printf("OCI ERROR CODE:%dnerror information: %sn",errcode,errbuf);
      break;
    case OCI_INVALID_HANDLE:
      (void) printf("OCI ERROR CODE: OCI_INVALID_HANDLEn");
      break;
    case OCI_STILL_EXECUTING:
      (void) printf("OCI ERROR CODE: OCI_STILL_EXECUTINGn");
      break;
    default:
      break;


     }
    }

|
3. 如果直接用oci开发,很麻烦, 我推荐你用Pro C/C++ 那要方便的多, 如果你一定要用oci开发,最好是在oci上进行封装成一定的接口, 好多驱动程序都是在oci上进程封装的。这要发了定的时间,还有技术难度。
   
   也可以使用其他的驱动程序啊, 比如ODBC, 你可以到www.oracle.com上去下载,这就和在windows下用odbc是一样的了.

|
1.  如果你装了Oracle服务端或客户端,可以在里面找到一个oci的文件夹,里面的头文件   就可以了,库已经生成。


|
2. 不要配置,只要在头文件里包含相关的头文件, 编译和链接时加上库文件就可以了。

|
here is a link:
http://download-east.oracle.com/docs/cd/A81042_01/DOC/appdev.816/a76975/toc.htm

    
 
 

您可能感兴趣的文章:

  • linux c下利用srand和rand函数生成随机字符串
  • 请问:Linux下用C编程计算CPU利用率和内存利用率?
  • linux下利用(cat,strings,head,sed)命令生成随机字符串
  • 在2003下利用vmware安装了linux,又利用host-only方式上了网,问题如下多谢指点!!!
  • 如何利用Linux安装盘制作启动盘?
  • 谁知道linux/unix下利用Schema读取校验xml的开源代码,给一个链接,谢谢!
  • Linux CD 怎么利用????????????????
  • Linux下利用MC35实现GPRS上网的问题
  • 怎样以日志的形式记录Linux上CPU以及Memory的利用情况.
  • linux下利用定时任务执行db2存储过程
  • Linux如何利用了段机制又巧妙地绕过了段机制?
  • linux c 怎样利用pro*c/c++操作 win2000 下 oracle 谢谢
  • 请教:linux下有统计CPU的个数和CPU利用率的函数吗???(急!!!)
  • Linux Eclipse的Make文件利用
  • 怎樣在Linux下利用网絡上的windows打印机
  • 如何利用Linux内核线程来保存用户进程
  • linux c编写的利用cmpp发送短信的源代码
  • 怎么样用程序取得Linux系统的CPU利用率和内存的使用情况呀?
  • Linux系统下利用java连接Oracle 10G
  • Linux中利用bochs安装Minix系统出现以下问题,无法继续下去.
  • linux下如何利用socket测试服务器是否可达?
  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • Linux系统下Oracle的启动与Oracle监听的启动
  • 在linux 中如何删除oracle db 与卸载oracle.
  • 如何将Aix上的oracle 物理备份 然后再在linux 系统上还原oracle
  • 那里有免费的oracle odbc driver for linux?或怎么破解easysoft oracle odbc driver安装包?急
  • XP Oracle客户端进入Linux Oracle服务端
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • 在Red Hat Linux 9 和 Oracle 9.2 环境下,如何配制字符集,让Oracle能存入并显示日语里的假名?
  • 红帽Linux表示Oracle提供Linux支持是不完美的
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux 下c++开发error while loading shared libraries问题解决
  • 我常未开发过Linux下的程序,请问Linux下可以使用那些开发工具,最好的开发工具是什么版本?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 嵌入式linux开发与防火墙系统linux开发
  • embedded linux开发和linux开发 要求的知识领域有什么不同?
  • linux下用java开发是不是JB就可以,JAVA在LINUX下开发有优势吧!
  • linux 嵌入式开发用不用买开发板,买什么样的开发板?
  • 谁知道国内有那些公司在linux平台上做开发的,或开发linux软件的?
  • 作 Linux/Unix开发 应该从何处入手?致力于Linux开发的迷惑???欢迎讨论。
  • 我是学习web开发的,主要是java开发SSH开发框架和ajax等。我想知道有没有必要学习一下linux相关知识。
  • 请问在Linux 下用C开发移动增值软件都有什么开发工具啊,我以前一直在Windows下用VC开发
  • 请问大家 在linux下开发嵌入式linux用什么集成开发环境?
  • linux 嵌入式开发用买开发板吗?
  • 请问LINUX下开发大家一般都是什么开发环境?
  • 我想在Linux下开发,不知道用什么工具、什么开发语言??
  • 各位设备驱动开发的朋友,请问,linux设备驱动开发和网络编程开发哪一样工资比较高呀?
  • 强烈建议将linux/Unix栏目放到“软件开发者”大类里面来。----Unix开发的人助威支持!!!
  • 关于linux内核开发和应用开发的区别
  • 学习linux驱动开发,买什么开发板好?
  • 请问在哪下载嵌入式Linux开发平台???想学嵌入式开发!!!
  • 从windows开发转Linux开发 的前辈请进!!!
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3