大家好,我想用vc++ 调用oci实现基本的sql查询,
select  table_name,tablespace_name from user_tables怎样实现呀,非常急,请各位多多指教

解决方案 »

  1.   

    如果只是简单的查询需要OCI吗?
    OCI可不是一两句话说的清的
      

  2.   

    我已连接数据库,在函数OCIDefineByPos和OCIDefineObject有问题不知怎样定义   OCIType *addr_tdo = (OCIType *) 0;
      OCIDefine *defn1p = (OCIDefine *) 0, *defn2p = (OCIDefine *) 0;
      sword status;
      OCIRef *addrref = (OCIRef *) 0, *addrref1 = (OCIRef *) 0;
      sword custno =0;
      int i = 0;
      UserTable *addr=NULL;
      ub4     ref_len;
      /* define the application request  */
     checkerr(errhp, OCIStmtPrepare(stmthp, errhp, 
     (text *)cSQL, (ub4)strlen(cSQL), 
     (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));   checkerr(errhp, OCIDefineByPos(stmthp, &defn1p, errhp, (ub4) 1,
      (dvoid *)0 /*&addr*/,
      (sb4) sizeof(addr), SQLT_CHR, (dvoid *) 0, (ub2 *)0,
      (ub2 *)0, (ub4) OCI_DEFAULT));
         
      addrref = (OCIRef *)NULL;
      checkerr(errhp, OCIDefineByPos(stmthp, &defn2p, errhp, (ub4) 2,
      (dvoid *) NULL,
      (sb4) 0, SQLT_REF, (dvoid *) 0, (ub2 *)0,
      (ub2 *)0, (ub4) OCI_DEFAULT));
      OCITypeByName(envhp, errhp, svchp, (text *)0, (ub4)0,
              (text *)"table_name",
              (ub4)strlen((char *)"table_name"),
              (text *) 0, (ub4) 0, OCI_DURATION_SESSION,
              OCI_TYPEGET_HEADER, &addr_tdo);   checkerr(errhp, OCIDefineObject(defn2p, errhp, addr_tdo,
      (dvoid **)addrref,
      &ref_len, (dvoid **)0, (ub4 *)0));
      checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4) 0,
      (OCISnapshot *) NULL, (OCISnapshot *) NULL,
      (ub4) OCI_DEFAULT));
      do
      {
    printf("custno = %d fetched address\n", custno); if ( addrref )
    {
    //  pin_display_tables(envhp, errhp, addrref);
    }
    else
      printf("Address ref is NULL\n");   }
      while ((status = OCIStmtFetch(stmthp, errhp, (ub4) 1,  (ub4) OCI_FETCH_NEXT,
       (ub4) OCI_DEFAULT)) == OCI_SUCCESS ||
    status == OCI_SUCCESS_WITH_INFO);
      if ( status != OCI_NO_DATA )
    checkerr(errhp, status);   printf("\n\n");
    }
      

  3.   

    建议自己先封装一下OCI然后再用!!
      

  4.   

    给你一个例程:
    boolean logged_on = FALSE;
    text *username = (text *) "mp3";
    text *password = (text *) "zsmp3";
    text *dbname = (text *) "ora85";
    text *mySql = (text *)"select c1,c2 from test")"; OCIEnv *envhp;
    OCISvcCtx *svchp;
    OCIError *errhp;
    OCIStmt *select_p;
    OCIDefine *defnp[2];

    sword errr;
    sword status;
    sword a,b,swResult;
    char rname[100];
    char rurl[100];
    memset(rname,0,sizeof(rname));
    memset(rurl,0,sizeof(rurl)); if (init_handles(&envhp, &errhp, (ub4)OCI_DEFAULT))
    {
    printf("FAILED: init_handles()\n");
    return cleanup(logged_on, envhp, svchp, errhp);
    }
    //登录
    if (OCILogon(envhp, errhp, &svchp, username, strlen (username),
       password, strlen (password), dbname, strlen(dbname)))
    {
    printf("FAILED: log_on()\n");
    return cleanup(logged_on, envhp, svchp, errhp);
    }
    if (OCIHandleAlloc((dvoid *)envhp, (dvoid **) &select_p,(ub4)OCI_HTYPE_STMT, (CONST size_t) 0, (dvoid **) 0))
    {
    printf("FAILED: alloc statement handles\n");
    return cleanup(logged_on, envhp, svchp, errhp);
    }
      logged_on = TRUE;//可以关闭数据库
    //开始读表的操作
      //准备SQL语句
      if (OCIStmtPrepare (select_p, errhp,mySql, strlen(mySql), OCI_NTV_SYNTAX, OCI_DEFAULT))
      {
        printf ("Prepare failed \n");
        return (OCI_ERROR);
      }
       OCITransCommit (svchp,errhp,OCI_DEFAULT ); //OCI_DEFAULT 
      //执行SQL语句
     /*  if (errr = OCIStmtExecute(svchp, 
                                select_p,
                                errhp, 
                                (ub4) 0, 
                                (ub4) 0, 
                                (OCISnapshot *) NULL, 
                                (OCISnapshot *) NULL, 
                                (ub4) OCI_DEFAULT))
      {
        if (errr != OCI_NO_DATA) return errr;
        
      }
     
     //指定取出的字段
      if ((a=OCIDefineByPos ( select_p, 
                           &defnp[0],
                           errhp,
                           1,
                           &rname,
                           sizeof(rname),
                           SQLT_STR,
                           (dvoid *) 0,
                           (dvoid *) 0,
                           (dvoid *) 0,
                           OCI_DEFAULT)) ||
          (b=OCIDefineByPos ( select_p, 
                           &defnp[1],
                           errhp,
                           2,
                           &rurl,
                           sizeof(rurl),
                           SQLT_STR,
                           (dvoid *) 0,
                           (dvoid *) 0,
                           (dvoid *) 0,
                           OCI_DEFAULT)))
      {
        printf ("Failed to define\n");
        return (OCI_ERROR);
      }
     FILE *fp;
     fp=fopen("test.txt","w");
      //循环取记录 OCIStmtFetch (select_p, errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)))
      while((swResult=OCIStmtFetch(select_p,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)) != OCI_NO_DATA)
      {
      fprintf(fp,"%s\n%s\n",rname,rurl);

      }
      if(fp)
      fclose(fp);*/
    return cleanup(logged_on, envhp, svchp, errhp);
    }void report_error(errhp)
    OCIError *errhp;
    {
      text  msgbuf[512];
      sb4   errcode = 0;
     
      memset((void *) msgbuf, (int)'\0', (size_t)512);  OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
                           msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
      if (errcode)
      {
        printf("ERROR CODE = %d\n", errcode);
        printf("%.*s\n", 512, msgbuf);
        exit(1);
      }}
    /* ----------------------------------------------------------------- */
    /* initialize environment, allocate handles                          */ 
    /* ----------------------------------------------------------------- */
    sword init_handles(envhp, errhp, init_mode)
    OCIEnv **envhp; 
    OCIError **errhp; 
    ub4 init_mode;
    {
      printf("Environment setup ....\n");  if (OCIInitialize(init_mode, (dvoid *)0, 
                        (dvoid * (*)(dvoid *, size_t)) 0,
                        (dvoid * (*)(dvoid *, dvoid *, size_t))0, 
                        (void (*)(dvoid *, dvoid *)) 0 ))
      {     
        printf("FAILED: OCIInitialize()\n");
        return OCI_ERROR;
      }  if (OCIEnvInit((OCIEnv **) envhp, (ub4) OCI_DEFAULT,
                     (size_t) 0, (dvoid **) 0 ))
      {
        printf("FAILED: OCIEnvInit()\n");
        return OCI_ERROR;
      }  if (OCIHandleAlloc((dvoid *) *envhp, (dvoid **) errhp,
                         (ub4) OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0))
      {
        printf("FAILED: OCIHandleAlloc() on errhp\n");
        return OCI_ERROR;
      }
     
      return OCI_SUCCESS;
    }/*
     *  Exit program with an exit code.
     */
    sword cleanup(loggedon, envhp, svchp, errhp)
    boolean loggedon; 
    OCIEnv    *envhp; 
    OCISvcCtx *svchp;
    OCIError  *errhp;
    {  report_error(errhp);  if (loggedon)
        OCILogoff (svchp, errhp);   printf("Freeing handles ...\n");
     
      if (envhp)
         OCIHandleFree((dvoid *) envhp, (ub4) OCI_HTYPE_ENV);  return OCI_SUCCESS;
    }
    这个应该可以.最过研究的,其他的还不会.也正在求人指导.这个程序肯定能用.
      

  5.   

    你可以到oracle主页下载oracle帮助文档,其中有oci的文档.文档里列出了一些例子程序,程序在../ORACLE_HOME/rdbms/demo下(需要安装0racle Compaion CD即oracle安装盘第三章).这些例子是C语言写的,对使用oci讲的很清楚.
      

  6.   

    oracle10gr1帮助文档下载地址:
    http://www.oracle.com/technology/documentation/database10g.html
    oci例子需要安装oracle companion cd,安装后在../oracle_home/rdbms/demo下是源代码.
    oracle10gr1 companion cd的下载地址:
    http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/winsoft.html