请教: 如何在unix下用c开发连接oracle数据库.

请教如题
望大侠指点,谢谢了,急在线等
[30 byte] By [crsit-常乐笑] at [2008-1-9]
# 1
oracle提供了C接口呀,具体你还是找本书或者oracle的资料看看吧
# 2
在linux下可以通过libsqlora8-2.3.3这个来访问
但在unix下我安装不了 libsqlora8-2.3.3, 会报错 不解呀
刚接触linux和unix 望大家多提点呀
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 3
用pro*c吧
vc8-沧海-巫山 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 4
听过,不知道如何用,望指教
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 5
上网搜一下吧,有不少例子
vc8-沧海-巫山 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 6
找了一些, 都是比较乱的...
理不了头绪呀....
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 7
用E SQL 写一套底层就可以了啊
连接,
插入、删除、查询
断开连接

做成函数库
huxmazhuan-EDGE at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 8
用E SQL其他的操作都很容易的

只是查询要困难一点,要用sqlda结构,不过网上都有可参考的东西了

huxmazhuan-EDGE at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 9
大哥,拜托了
虽说网上资料多,但我却没有找到 条理比较清晰的。

若你有的话,就发我一份吧,万分感激~~~

crsit@126.com
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 10
你要用ESQL的话,网上资料多如牛毛啊
huxmazhuan-EDGE at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 11
回去给你传,现在下班了,今天没有带移动硬盘
huxmazhuan-EDGE at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 12
好的,谢谢了~`

能在unix下解决访问oracle数据库的存储过程就可以了
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 13
int ConnectDb(char *p_user, char *p_pswd, char *p_server)
{
EXEC SQL BEGIN DECLARE SECTION;
char sDbNameAndPawd[80];
char sDbServerName[30];
EXEC SQL END DECLARE SECTION;

memset(sDbNameAndPawd, 0, sizeof(sDbNameAndPawd));
memset(sDbServerName, 0, sizeof(sDbServerName));

sprintf(sDbNameAndPawd, "%s/%s", p_user, p_pswd);
sprintf(sDbServerName, "%s", p_server);

if (memcmp(p_server, "NULL", 4) == 0) //如果为本地连接,服务器名设置为空
{
EXEC SQL CONNECT :sDbNameAndPawd;
}
else
{
EXEC SQL CONNECT :sDbNameAndPawd using :sDbServerName;
}

if(sqlca.sqlcode != 0)
{
return -1;
}
else
{
return 0;
}
}
lynn_fch at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 14
OCI楼主可以考虑一下 OCI
PLYAT-山野的風 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 15
给你发了
huxmazhuan-EDGE at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 16
en,谢谢大家的帮助,大致有头绪了

还有就是,我按照你们说的写好了文件,如何编译呢?
同一般的.c程序一样么? (环境是unix)

如果不一样的话,望给个 操作步骤 (就如上面的连接函数吧,假设就那一个方法);
我如何编译?

为了感谢大家的帮助,问题解决后我再开一贴100分谢谢大家。
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 17
oracle用pre先进行预处理后,然后再用c编译,你可以写个makefile来完成。

具体的编译命令自己去看了。
huxmazhuan-EDGE at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 18
我用 gcc -L$ORACLE_HOME/lib -lclntsh tora2.c -o tora2 这个编译 tora2.c文件
编译成功

但执行到 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 时
报Memory fault(coredump) 问题

以下是生成的.c文件

/* Result Sets Interface */
#ifndef SQL_CRSR
# define SQL_CRSR
struct sql_cursor
{
unsigned int curocn;
void *ptr1;
void *ptr2;
unsigned long magic;
};
typedef struct sql_cursor sql_cursor;
typedef struct sql_cursor SQL_CURSOR;
#endif /* SQL_CRSR */

/* Thread Safety */
typedef void * sql_context;
typedef void * SQL_CONTEXT;

/* Object support */
struct sqltvn
{
unsigned char *tvnvsn;
unsigned short tvnvsnl;
unsigned char *tvnnm;
unsigned short tvnnml;
unsigned char *tvnsnm;
unsigned short tvnsnml;
};
typedef struct sqltvn sqltvn;

struct sqladts
{
unsigned int adtvsn;
unsigned short adtmode;
unsigned short adtnum;
sqltvn adttvn[1];
};
typedef struct sqladts sqladts;

static struct sqladts sqladt = {
1,1,0,
};

/* Binding to PL/SQL Records */
struct sqltdss
{
unsigned int tdsvsn;
unsigned short tdsnum;
unsigned char *tdsval[1];
};
typedef struct sqltdss sqltdss;
static struct sqltdss sqltds =
{
1,
0,
};

/* File name & Package Name */
struct sqlcxp
{
unsigned short fillen;
char filnam[11];
};
static const struct sqlcxp sqlfpn =
{
10,
"D:\\tora.pc"
};

static unsigned long sqlctx = 71587;

static struct sqlexd {
unsigned int sqlvsn;
unsigned int arrsiz;
unsigned int iters;
unsigned int offset;
unsigned short selerr;
unsigned short sqlety;
unsigned int occurs;
const short *cud;
unsigned char *sqlest;
const char *stmt;
sqladts *sqladtp;
sqltdss *sqltdsp;
void **sqphsv;
unsigned int *sqphsl;
int *sqphss;
void **sqpind;
int *sqpins;
unsigned int *sqparm;
unsigned int **sqparc;
unsigned short *sqpadto;
unsigned short *sqptdso;
void *sqhstv[4];
unsigned int sqhstl[4];
int sqhsts[4];
void *sqindv[4];
int sqinds[4];
unsigned int sqharm[4];
unsigned int *sqharc[4];
unsigned short sqadto[4];
unsigned short sqtdso[4];
} sqlstm = {10,4};

/* SQLLIB Prototypes */
extern void sqlcxt (void **, unsigned long *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlcx2t(void **, unsigned long *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlbuft(void **, char *);
extern void sqlgs2t(void **, char *);
extern void sqlorat(void **, unsigned long *, void *);

/* Forms Interface */
static const int IAPSUCC = 0;
static const int IAPFAIL = 1403;
static const int IAPFTL = 535;
extern void sqliem(char *, int *);

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
typedef struct { unsigned short len; unsigned char arr[1]; } varchar;

/* cud (compilation unit data) array */
static const short sqlcud0[] =
{10,4130,852,0,0,
5,0,0,1,0,0,27,28,0,0,4,4,0,1,0,1,97,0,0,1,10,0,0,1,10,0,0,1,10,0,0,
36,0,0,2,0,0,27,32,0,0,4,4,0,1,0,1,97,0,0,1,10,0,0,1,97,0,0,1,10,0,0,
};

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>

#ifndef SQLCA
#define SQLCA 1

struct sqlca
{
/* ub1 */ char sqlcaid[8];
/* b4 */ int sqlabc;
/* b4 */ int sqlcode;
struct
{
/* ub2 */ unsigned short sqlerrml;
/* ub1 */ char sqlerrmc[70];
} sqlerrm;
/* ub1 */ char sqlerrp[8];
/* b4 */ int sqlerrd[6];
/* ub1 */ char sqlwarn[8];
/* ub1 */ char sqlext[8];
};

#ifndef SQLCA_NONE
#ifdef SQLCA_STORAGE_CLASS
SQLCA_STORAGE_CLASS struct sqlca sqlca
#else
struct sqlca sqlca
#endif

#ifdef SQLCA_INIT
= {
{'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
sizeof(struct sqlca),
0,
{ 0, {0}},
{'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
}
#endif
;
#endif

#endif
int main(){
char user[20] = "snrt";
char pswd[20] = "snrt";
char server[20] = "snrt";
if(ConnectDb(user, pswd, server)>0)
printf("\n ok!");
}

int ConnectDb(char *p_user, char *p_pswd, char *p_server)
{
/* EXEC SQL BEGIN DECLARE SECTION; */

char sDbNameAndPawd[80];
char sDbServerName[30];
/* EXEC SQL END DECLARE SECTION; */

memset(sDbNameAndPawd, 0, sizeof(sDbNameAndPawd));
memset(sDbServerName, 0, sizeof(sDbServerName));

sprintf(sDbNameAndPawd, "%s/%s", p_user, p_pswd);
sprintf(sDbServerName, "%s", p_server);

if (memcmp(p_server, "NULL", 4) == 0) //如果为本地连接,服务器名设置为空
{
/* EXEC SQL CONNECT :sDbNameAndPawd; */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )5;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)sDbNameAndPawd;
sqlstm.sqhstl[0] = (unsigned int )80;
sqlstm.sqhsts[0] = ( int )80;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

}
else
{
/* EXEC SQL CONNECT :sDbNameAndPawd using :sDbServerName; */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )36;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)sDbNameAndPawd;
sqlstm.sqhstl[0] = (unsigned int )80;
sqlstm.sqhsts[0] = ( int )80;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[2] = ( void *)sDbServerName;
sqlstm.sqhstl[2] = (unsigned int )30;
sqlstm.sqhsts[2] = ( int )30;
sqlstm.sqindv[2] = ( void *)0;
sqlstm.sqinds[2] = ( int )0;
sqlstm.sqharm[2] = (unsigned int )0;
sqlstm.sqadto[2] = (unsigned short )0;
sqlstm.sqtdso[2] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

}

if(sqlca.sqlcode != 0)
{
return -1;
}
else
{
return 0;
}
}
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 19
谁能帮帮我啊....
这个问题都困恼了我好几天了呀

我后来直接拿 安装oracle目录下面的proc目录下的 .pc文件编译成.c文件 在编译就报
用指令:
gcc iupdate.c -o iupdate
编译报错:
iupdate.c:147:17: oci.h: No such file or directory
iupdate.c:149:19: sqlca.h: No such file or directory
iupdate.c: In function `Sample_Error':
iupdate.c:155: error: `sqlca' undeclared (first use in this function)
iupdate.c:155: error: (Each undeclared identifier is reported only once
iupdate.c:155: error: for each function it appears in.)
iupdate.c: At top level:
iupdate.c:178: error: syntax error before "OCIBlobLocator"
iupdate.c:178: warning: data definition has no type or storage class
iupdate.c:179: error: syntax error before '{' token
iupdate.c:214: error: syntax error before '(' token
iupdate.c: In function `updateLOB_proc':
iupdate.c:223: error: `OCIBlobLocator' undeclared (first use in this function)
iupdate.c:237: error: `sqlca' undeclared (first use in this function)
iupdate.c: In function `main':
iupdate.c:355: error: `sqlca' undeclared (first use in this function)
iupdate.c:342: warning: return type of 'main' is not `int'
crsit-常乐笑 at 2007-10-18 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 20
用比如Pro*C、ESQL/C这样的嵌入式sql简直是自杀式行为。Oracle提供的oci/c++库就是为了消灭proc。不知informix有没有类似的库用于消灭esqlc。

OCCI provides a library of standard database access and retrieval functions in the
form of a dynamic runtime library (OCCI classes) that can be linked in a C++
application at runtime. This eliminates the need to embed SQL or PL/SQL within
third-generation language (3GL) programs.

Oracle C++ Call Interface Programmers Guide
a96583.pdf
# 21
>用比如Pro*C、ESQL/C这样的嵌入式sql简直是自杀式行为。

或者说是自虐:)