文档章节

在linux oracle精简客户端下编译oci程序ociTest.cpp时由于选项次序引起的问题

wangxuwei
 wangxuwei
发布于 2016/05/31 13:38
字数 1481
阅读 92
收藏 0

:~/prg/embc/ora$ g++ -I${ORACLE_HOME}/sdk/include  -L${ORACLE_HOME}/lib -lclntsh -o ociTest ociTest.cpp

/tmp/ccb8nVWk.o:在函数‘main’中:

ociTest.cpp:(.text+0xcf):对‘OCIEnvCreate’未定义的引用

ociTest.cpp:(.text+0x14f):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x175):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x1be):对‘OCIServerAttach’未定义的引用

ociTest.cpp:(.text+0x22c):对‘OCIErrorGet’未定义的引用

ociTest.cpp:(.text+0x27a):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x28e):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x2a2):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x36b):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x391):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x3c1):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x3e7):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x438):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x489):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x4b1):对‘OCISessionBegin’未定义的引用

ociTest.cpp:(.text+0x514):对‘OCIErrorGet’未定义的引用

ociTest.cpp:(.text+0x562):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x576):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x58a):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x5e0):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x611):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x682):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x727):对‘OCIStmtPrepare’未定义的引用

ociTest.cpp:(.text+0x824):对‘OCIDefineByPos’未定义的引用

ociTest.cpp:(.text+0x887):对‘OCIDefineByPos’未定义的引用

ociTest.cpp:(.text+0x8b7):对‘OCIAttrGet’未定义的引用

ociTest.cpp:(.text+0x8f5):对‘OCIStmtExecute’未定义的引用

ociTest.cpp:(.text+0x967):对‘OCIStmtFetch2’未定义的引用

ociTest.cpp:(.text+0x9a1):对‘OCIAttrGet’未定义的引用

ociTest.cpp:(.text+0x9f3):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0xa64):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0xb42):对‘OCIStmtPrepare’未定义的引用

ociTest.cpp:(.text+0xbdd):对‘OCIStmtExecute’未定义的引用

ociTest.cpp:(.text+0xbf6):对‘OCILogoff’未定义的引用

ociTest.cpp:(.text+0xc14):对‘OCIServerDetach’未定义的引用

ociTest.cpp:(.text+0xc28):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0xc3c):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0xc50):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0xc64):对‘OCIHandleFree’未定义的引用

collect2: error: ld returned 1 exit status

~/prg/embc/ora$ g++ -o ociTest ociTest.cpp -I${ORACLE_HOME}/sdk/include  -L${ORACLE_HOME}/lib -lclntsh

~/prg/embc/ora$ ./ociTest 

Oracle environment initialization success!

Oracle server attach success!

user session success!

Create stmt success !

Create prepare success!

  

7369 SMITH 

7499 ALLEN 

7521 WARD 

7566 JONES 

7654 MARTIN 

7698 BLAKE 

7782 CLARK 

7788 SCOTT 

7839 KING 

7844 TURNER 

7876 ADAMS 

7900 JAMES 

7902 FORD 

7934 MILLER 

 rows :14

Create stmt success !

Create prepare success!

 

ociTest.cpp

// g++ -I${ORACLE_HOME}/sdk/include -o ociTest ociTest.cpp -L${ORACLE_HOME}/lib -lclntsh
#include <oci.h>
#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
using namespace std;

//存放查询数据的结构体
struct result
{
    char ename[20];
    char cname[20];
    result()
    {
        memset(ename, '\0', sizeof(ename));
        memset(cname, '\0', sizeof(cname));
    }
};
 
int main()
{
    // 初始化 OCI 环境句柄指针
    OCIEnv *envhpp = NULL;
    // 初始化服务器句柄
    OCIServer *servhpp = NULL;
    // 用于捕获 OCI 错误信息
    OCIError *errhpp = NULL;
    // 初始化会话句柄
    OCISession *usrhpp = NULL;
    // 初始化服务上下文句柄
    OCISvcCtx *svchpp = NULL;
    // 初始化表达式句柄
    OCIStmt *stmthpp = NULL;
 
    string server="winorcl";
 
    // 创建 OCI 环境 , 并设置环境句柄。
    sword swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
    if (swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
    {
        cout << "Oracle environment initialization error!" << endl;
        exit(1);
    }
    cout << "Oracle environment initialization success!" << endl;
 
    // 创建错误句柄
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
 
    // 创建服务句柄
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&servhpp, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);
 
    // 连接服务器,如果失败则获取错误码
    if (OCIServerAttach(servhpp, errhpp, (text *)server.c_str(), strlen(server.c_str()), 0) != OCI_SUCCESS)
    {
        int errcno;
        char errbuf[512] = "";
        sb4 errcode;
 
        // 获取错误指针和 OCI 错误代码
        OCIErrorGet((dvoid *)errhpp, (ub4)1, (text *)NULL, &errcode, (ub1 *)errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
        errcno = errcode;
 
        cout << "Oracle server attach error:" << errbuf << endl;
        OCIHandleFree((dvoid *)envhpp,OCI_HTYPE_ENV);
        OCIHandleFree((dvoid *)servhpp,OCI_HTYPE_SERVER);
        OCIHandleFree((dvoid *)errhpp,OCI_HTYPE_ERROR);
        exit(1);
    }
    cout << "Oracle server attach success!"<< endl;
 
    /***************** 连接数据库 ****************/
    string user = "scott";
    string pas = "tiger";
    errhpp = NULL;
 
    // 创建错误句柄
    (void) OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
    // 创建服务上下文句柄
    (void) OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&svchpp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **)0);
    // 设置属性
    (void) OCIAttrSet((dvoid *)svchpp, OCI_HTYPE_SVCCTX, (dvoid *)servhpp, (ub4)0, OCI_ATTR_SERVER, (OCIError *)errhpp);
    // 创建用户连接句柄
    (void) OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&usrhpp, (ub4)OCI_HTYPE_SESSION, (size_t) 0, (dvoid **)0);
    // 设置用户名、密码
    (void) OCIAttrSet((dvoid *)usrhpp, (ub4)OCI_HTYPE_SESSION, (dvoid *)user.c_str(), (ub4)strlen(user.c_str()), (ub4)OCI_ATTR_USERNAME, errhpp);
    (void) OCIAttrSet((dvoid *)usrhpp, (ub4)OCI_HTYPE_SESSION, (dvoid *)pas.c_str(), (ub4)strlen(pas.c_str()), (ub4)OCI_ATTR_PASSWORD, errhpp);
 
    // 创建会话连接
    if(OCISessionBegin(svchpp, errhpp, usrhpp, OCI_CRED_RDBMS, (ub4)OCI_DEFAULT) != OCI_SUCCESS)
    {
        int errcno;
        char errbuf[512]={'\0'};
        sb4 errcode;
        
        // 获取错误指针和 OCI 错误代码
        OCIErrorGet((dvoid *)errhpp, (ub4)1, (text *)NULL, &errcode, (ub1 *)errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
        errcno = errcode;
        cout << "User session error:" << errbuf << endl;
        OCIHandleFree((dvoid *)errhpp,OCI_HTYPE_ERROR);
        OCIHandleFree((dvoid *)usrhpp,OCI_HTYPE_SESSION);
        OCIHandleFree((dvoid *)svchpp,OCI_HTYPE_SVCCTX);
        exit(1); 
    }
    cout << "user session success!" << endl;
    
    (void) OCIAttrSet((dvoid *)svchpp, (ub4) OCI_HTYPE_SVCCTX, (dvoid *)usrhpp, (ub4)0, (ub4)OCI_ATTR_SESSION, errhpp);
 
    /*************** 执行 查询SQL 语句 ******************/
    errhpp = NULL;
 
    // 创建一个表达式句柄
    if (OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&stmthpp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0) != OCI_SUCCESS)
    {
        cout << "Create STMT error !" << endl;
        exit(1);
    }
    cout << "Create stmt success !" << endl;
    
    // 创建错误句柄
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
    
    // Select语句
    char sql[255] = "select EMPNO,ENAME from emp ";
    
    if (OCIStmtPrepare(stmthpp, errhpp, (text *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT) != OCI_SUCCESS)
    {
         cout << "Create prepare error!" << sql << endl;
         exit(1);
    }
    cout << "Create prepare success!" << endl;
 
    /********* 绑定参数 ***********/
    // 申请绑定字段的句柄
    OCIDefine *bhp1 = NULL;
    OCIDefine *bhp2 = NULL;
    
    // 存放数据的结构
    struct result rst;
    
    // 指定提取数据长度
    ub2 datalen = 0;
    // 定义指示器变量 , 用于取可能存在空值的字段
    char isnul[6] = "";
    // 定义输出变量 ,
    OCIDefineByPos(stmthpp, &bhp1, errhpp, 1, (dvoid *)&rst.ename, sizeof(rst.ename), SQLT_CHR, NULL, &datalen, NULL, OCI_DEFAULT);
    OCIDefineByPos(stmthpp, &bhp2, errhpp, 2, (dvoid *)&rst.cname, sizeof(rst.cname), SQLT_STR, NULL, &datalen, NULL, OCI_DEFAULT);
 
    // 获取 SQL 语句类型
    ub2 stmt_type;
    OCIAttrGet ((dvoid *)stmthpp, (ub4)OCI_HTYPE_STMT, (dvoid *)&stmt_type, (ub4 *)0, (ub4)OCI_ATTR_STMT_TYPE, errhpp);
    
    // 执行 SQL 语句
    OCIStmtExecute(svchpp, stmthpp, errhpp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
 
    // 获取查询信息
    int rows_fetched;
    do
    {
        cerr << rst.ename<< " ";
        cerr << rst.cname<< " \n";
    }
    while(OCIStmtFetch2(stmthpp, errhpp, 1, OCI_FETCH_NEXT, 1, OCI_DEFAULT) != OCI_NO_DATA);
 
    // 获得记录条数
    OCIAttrGet((CONST void *)stmthpp, OCI_HTYPE_STMT, (void *)&rows_fetched, (ub4 *)sizeof(rows_fetched), OCI_ATTR_ROW_COUNT, errhpp);
    cout << " rows :" << rows_fetched << endl;
 
    /*************** 执行 新增SQL 语句 ******************/
    if (OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&stmthpp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0) != OCI_SUCCESS)
    {
        cout << "Create STMT error !" << endl;
        exit(1);
    }
    cout << "Create stmt success !" << endl;
 
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
 
    // Insert语句
    char sql2[255] = "insert into emp (EMPNO,ENAME) values(7900 , 'testoci')";
    
    // 准备Sql语句
    if (OCIStmtPrepare(stmthpp, errhpp, (text *)sql2, (ub4)strlen(sql2), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT) != OCI_SUCCESS)
    {
         cout << "Create prepare error!" << sql2 << endl;
         exit(1);
    }
    cout << "Create prepare success!" << endl;
    
    // 执行SQL 语句
    OCIStmtExecute(svchpp, stmthpp, errhpp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);

    // 断开用户会话
    OCILogoff(svchpp, errhpp);
    
    // 断开服务器连接
    OCIServerDetach(servhpp, errhpp, OCI_DEFAULT);
    
    // 释放资源
    OCIHandleFree((dvoid *) stmthpp, OCI_HTYPE_STMT);
    OCIHandleFree((dvoid *) svchpp, OCI_HTYPE_SVCCTX);
    OCIHandleFree((dvoid *) servhpp, OCI_HTYPE_SERVER);
    OCIHandleFree((dvoid *) errhpp, OCI_HTYPE_ERROR);
 
    return 0;
}

 

© 著作权归作者所有

wangxuwei
粉丝 27
博文 342
码字总数 134455
作品 0
杭州
其他
私信 提问
linux服务器上 oracle instantclient 客户端的安装和配置

linux服务器上 oracle instantclient 客户端的安装和配置 2013年03月07日 18:03:16 阅读数:3437 Oracle Instant client 是oracle提供的简便客户端, 支持多种平台. 从oracle网站下载。 下载地...

rootliu
2018/05/16
68
0
Navicat连接Oracle报错

今天给客户那边部署项目,遇到了一个问题,折腾了很久,感觉是自己这边大脑短路造成的,以后一定要注意。 问题是这样的,我们的项目属于定制化项目,去年给客户部署了一套系统,今年系统需要...

王子城
2018/06/27
177
0
Navicat Report Viewer 怎么设置选项

Navicat Report Viewer 常见的功能是给没有运作Navicat的计算机但安装了Navicat Report Viewer的用户分析报表。其用户介面是经过精心设计的,不仅可以快捷和简单地访问报表,还可以把报表打印...

Navicat数据库管理工具
2016/06/13
19
0
绿色PLSQL/Developer搭配Oracle精简客户端使用

主要以下几个步骤: 1. 下载Oracle精简客户端,并解压(不用安装) 2. 创建Oracle精简客户端配置文件(sqlnet.ora, tnsnames.ora) 3. 设置环境变量TNS_ADMIN 4. 设置PLSQL以管理员身份运行(...

黑桃
2014/07/14
2.1K
0
JDBC来连接Oracle数据库使用技巧

如图,是java和JDBC以及Oracle的数据库连接之间关系示意图, 1、在客户端软件开发中使用Thin驱动程序 在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、app...

e良师益友
2016/01/15
49
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情

0 相关源码 1 什么是Spring Boot 一个快速开发的脚手架 作用 快速创建独立的、生产级的基于Spring的应用程序 特性 无需部署WAR文件 提供starter简化配置 尽可能自动配置Spring以及第三方库 ...

JavaEdge
今天
7
0
TensorFlow 机器学习秘籍中文第二版(初稿)

TensorFlow 入门 介绍 TensorFlow 如何工作 声明变量和张量 使用占位符和变量 使用矩阵 声明操作符 实现激活函数 使用数据源 其他资源 TensorFlow 的方式 介绍 计算图中的操作 对嵌套操作分层...

ApacheCN_飞龙
今天
7
0
五、Java设计模式之迪米特原则

定义:一个对象应该对其他对象保持最小的了解,又叫最小知道原则 尽量降低类与类之间的耦合 优点:降低类之间的耦合 强调只和朋友交流,不和陌生人说话 朋友:出现在成员变量、方法的输入、输...

东风破2019
昨天
23
0
jvm虚拟机结构

1:jvm可操作数据类型分为原始类型和引用类型,因此存在原始值和引用值被应用在赋值,参数,返回和运算操作中,jvm希望在运行时 明确变量的类型,即编译器编译成class文件需要对变量进行类型...

xpp_ba
昨天
5
0
聊聊nacos Service的processClientBeat

序 本文主要研究一下nacos Service的processClientBeat Service.processClientBeat nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/Service.java public class Service ex......

go4it
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部