LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: yufeng8552

编译OCI的程序出现的问题,请教

[复制链接]
 楼主| 发表于 2003-8-31 12:08:41 | 显示全部楼层
from kj501:从makefile来看,这个软件本来就是作为库文件使用,因此它不是直接提供给用户使用的,而是提供给程序员作用的。
btw:make test没有问题,就说明库文件能够正常连接。你在make clean之前,应该运行一下test1和test2,看看有没有段错误之类的。

to kj501:不知如何运行已经make成功的两个程序test1和test2
是不是这样:
./test1 or ./test2
呵呵,我实在搞不清楚了。

既然libdb.a是库文件,那么不知如何设置啊,老哥

from 无双:这个是oracle自己的库
开发oci或是proc时要link它
顶上的FAQ应该有写

to 无双:我的程序里的test1里写了很多printf,但是不知为何始终不能出现在bash界面上呢,我记得原来实验过printf,可以写出来的啊,不懂了……
发表于 2003-8-31 19:03:50 | 显示全部楼层
最初由 yufeng8552 发表
to kj501:不知如何运行已经make成功的两个程序test1和test2
是不是这样:
./test1 or ./test2
呵呵,我实在搞不清楚了。

既然libdb.a是库文件,那么不知如何设置啊,老哥

应该就是这样了。
动态库要 在/etc/ld.so.conf中设置路径,静态库不需要,只要在编译时用-L指定静态库所在的目录即可。
 楼主| 发表于 2003-8-31 19:59:16 | 显示全部楼层
那生成的libdb.a看来是静态库咯,嘿嘿,老哥

那老哥如何实现test1文件里写的功能呢,如何编译

我是从windows里转过来的,所以很多不太了解的地方希望kj501和无双版主能海涵
发表于 2003-9-1 10:17:35 | 显示全部楼层
如果在程序中使用了某个库文件中的函数,可以在编译时用-I指定头文件的目录,-L指定库文件的目录。再用-l指定要连接的库文件
如:gcc -I/oracle/include -L/oracle/lib -lxxx
指定库文件名称时要按照unix的习惯,如:libmath.so在编译时要写成gcc -lmath,把lib简写成l,文件名的后缀去掉。
 楼主| 发表于 2003-9-2 16:34:57 | 显示全部楼层
to kj501:
正如老哥所说,的确是用./test1和./test2来运行make通过的程序,可是出现了如下错误

[root@BillingServer oci_demo]# ./test1
Connect OK
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Select 1 item fail
**********************************************
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
select from cursor failed
select from cursor succeed
**********************************************
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
Error - OCI_INVALID_HANDLE
段错误

下面为test1.c的文件内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <time.h>
#include <errno.h>
#include <math.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <semaphore.h>
#include <pthread.h>

#include "dbfunc.h"


int main()
{
    int result, query_qt, i;
    char buf[1024], sql[1024];
    emp_t emp;
    emp_t *pa_emp;
    resume_t resume;

    //连接到数据库
    if(DbsInit()==DB_OK && DbsConnect(10)==DB_OK)
    {
        printf("Connect fail\n");
        DbsDisConnect(10);
        exit(1);
    }
    printf("Connect OK\n");

    //select一条记录,使用bind
    emp.no=0;
    strcpy(sql, "select no,upd_ts,name,duty,age,salary from emp where no=:no");
    if(DbsEMP_SEL(10, sql, &emp)!=DB_OK)
    {
        printf("Select 1 rec fail\n");
    }
    else
    {
        printf("no:%.0lf\n", emp.no);
        printf("upd_ts:%s\n", emp.upd_ts);
        printf("name:%s\n", emp.name);
        printf("duty:%s\n", emp.duty);
        printf("age:%d\n", emp.age);
        printf("salary:%.2lf\n", emp.salary);
        printf("select 1 rec succeed\n");
    }
    printf("**********************************************\n");

    //select一批记录,使用带bind的cursor,由cursor函数分配空间
    emp.age=35;
    strcpy(sql, "select no,name,age from emp where age<:age order by no");
    if(DbsEMP_CUR(10, sql, &emp, &pa_emp, &query_qt)!=DB_OK)
    {
        printf("select from cursor failed\n");
    }
    for(i=0; i<query_qt; i++)
    {
        printf("no:%.0lf name:%s age:%d\n",
            pa_emp.no, pa_emp.name, pa_emp.age);
    }
    printf("select from cursor succeed\n");
    free(pa_emp);  
        //由应用释放cursor函数分配的空间
    printf("**********************************************\n");

    //插入带blob类型域的记录
    resume.no=10;
    resume.resume=(char *)malloc(32768);
    strcpy(buf, "我一个高中同学告诉我,他小时将“边区的太阳红又红”听成“变压器的太阳红又红”!!!!!他还给我讲了原因。因为他那时根本不知道“边区”是什么?只是记得很清楚,每天傍晚时可以看见村子西边红红的落日。最要命的是在他们村子西边的某个高处架着一台变压器。傍晚的时候,刚好可以看到变压器上方一轮红日此美景让我的同学印象颇深。于是便与每天傍晚都放的那首歌联系起来。此君还纳闷,为什么写歌的人知道他们村的变压器放在西边。");
    resume.resume[0]='\0';
    for(i=0; i<1; i++)
        strcat(resume.resume, buf);
    if(DbsRESUME_INS(10, NULL, &resume)!=DB_OK)
    {
        printf("insert blob fail\n");
        DbsRollback(10);
    }
    else
    {
        printf("insert blob succeed\n");
        DbsCommit(10);
    }
    printf("**********************************************\n");

    //选出带blob类型域的记录
    resume.no=10;
    resume.resume[0]='\0';
    if(DbsRESUME_SEL(10, NULL, &resume)!=DB_OK)
    {
        printf("select lob fail\n");
    }
    else
    {
        printf("no:%.0lf len:%d\n", resume.no, strlen(resume.resume));
        printf("resume:%s\n", resume.resume);
        printf("select lob succeed\n");
    }
    printf("**********************************************\n");

    //删除一条记录,直接执行
    sprintf(sql, "delete from resume where no=%d", 10);
    if(DbsSQLExec(10, sql)!=DB_OK)
    {
        printf("Delete resume fail\n");
        DbsRollback(10);
    }
    else
    {
        printf("Delete resume succeed\n");
        DbsCommit(10);
    }
    printf("**********************************************\n");

  ERROR:
    DbsDisConnect(10);
    exit(0);
}

和表情符号冲突了,希望没有什么大碍,不过都是printf语句里,没什么大关系
我随便建立了两个表emp和resume,下面是sql代码
create table emp
(
    no                        number(12) not null,
    upd_ts                date not null,
    name                char(20) not null,
    duty                char(1) not null,
    age                        number(6) not null,
    salary                number(12,2) not null,
    primary key (no)
);

insert into emp values(0,sysdate,'职员0','1',20,1000);
insert into emp values(1,sysdate,'职员1','1',30,2000);
insert into emp values(2,sysdate,'职员2','1',40,2500);

create table resume
(
    no                        number(12) not null,
    resume                blob not null,
    primary key (no)
);

不知如何处理段错误呢
发表于 2003-9-2 19:46:53 | 显示全部楼层
你以oracle用户身份运行看看,是不是还是这样。
 楼主| 发表于 2003-9-2 21:13:02 | 显示全部楼层
看来还是老哥经验比较丰富

以oracle用户运行这个./test1和./test2,就OK了
能够将所有的结果全部打印到bash界面上,可惜自己对QT或者GTK不熟悉,不能将信息传到界面上,可惜,可惜

下面是运行结果:
[oracle@BillingServer oci_demo]$ ./test1
Connect OK
no:0
upd_ts:01-SEP-03
name:employer01
duty:1
age:20
salary:1000.00
select 1 item succeed
**********************************************
no:0 name:employer01           age:20
no:1 name:employer02           age:30
select from cursor succeed
**********************************************
lob write size:404 amt:404
insert blob succeed
**********************************************
no:10 len:404
resume:我一个高中同学告诉我,他小时将“边区的太阳红又红”听成“变压器的太阳红又红”
!!!!!他还给我讲了原因。因为他那时根本不知道“边区”是什么?只是记得很清楚,每天傍晚时可以看见村子西边红红的落日。最要命的是在他们村子西边的某个高处架着一台变压器。傍晚的时候,刚好可以看到变压器上方一轮红日此美景让我的同学印象颇深。于是便与每天傍晚都放的那首歌联系起来。此君还纳闷,为什么写歌的人知道他们村的变压器放在西边。
select lob succeed
**********************************************
Delete resume succeed
**********************************************
[oracle@BillingServer oci_demo]$ ./test2
Thread 0 Connect OK
Thread 4 Connect OK
Thread 2 Connect OK
Thread 3 Connect OK
Thread 1 Connect OK
Thread 4 select emp fail, errcode:1403
no:1 upd_ts:01-SEP-03 name:employer02           no:3 upd_ts:01-SEP-03 name:employer04           duty:1 age:35 salary:4500.00
Thread 3 select emp succeed
duty:1 age:30 salary:2000.00
Thread 1 select emp succeed
no:0 upd_ts:01-SEP-03 name:employer01           duty:1 age:20 salary:1000.00
Thread 0 select emp succeed
no:2 upd_ts:01-SEP-03 name:employer03           duty:1 age:40 salary:2500.00
Thread 2 select emp succeed

PS:但是 , 我从windows上用 putty , winssh 等之类SSH软件联接到Linux上的时候不能正确显示中文,也就是在运行insert blob succeed的时候不能正确显示blob数据,不知老哥对远程登陆放面有什么研究没有,能否推荐一个能够很好显示中文的远程终端,最好是通过SSH协议的
发表于 2003-9-2 23:34:48 | 显示全部楼层
最初由 无双 发表

另外使用oracle用户时环境变量与root不一样
所以可以在oracle用户下成功

在root下不成功
其它oracle命令很多也是这样的

很多命令只能以orcale身份执行才有效,无双兄早就说了嘛,只是你没有理解而已。
 楼主| 发表于 2003-9-3 13:56:22 | 显示全部楼层
那倒是,很感谢两位的大力帮助

oracle看来还有很多东西值得我好好学习……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表