C如和联ORACLE数据库阿!!!!!

hanxian 2004-09-14 10:24:06
C如和联ORACLE数据库阿!!!!!
...全文
427 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
renjiass 2004-10-14
  • 打赏
  • 举报
回复
能不能提供通过oci/occi 来连接linux下c和oracle数据库的实例阿?先谢谢啦!
jjcql 2004-09-22
  • 打赏
  • 举报
回复
学会PROC你就知道怎么操作了
sukaru 2004-09-21
  • 打赏
  • 举报
回复
我们是写成.pc文件然后编译的,这样proc就可以作那些处理工作了。
下面是一个demo
EXEC SQL INCLUDE SQLCA;
main()
{/*主程序供测试用*/
EXEC SQL BEGIN DECLARE SECTION;
char user_name[30+1];/*登录数据库的用户名*/
char password[30+1];/*登录数据库的密码*/
EXEC SQL END DECLARE SECTION;
char date[20];
memset(user_name,0,sizeof(user_name));
memset(password,0,sizeof(password));
strcpy(user_name,"ops$pbora");
strcpy(password,"pbora");
/*连接数据库仅供测试用*/
EXEC SQL CONNECT :user_name IDENTIFIED BY :password;
if(0 != SQLCODE)
{
sprintf(_RetMsg,"连接数据库时出错!");
printf("连接数据库时出错!\n");
printf("错误代码:%s\n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
return RET_FAIL;
}/*连接数据库仅供测试用*/
EXEC SQL COMMIT WORK RELEASE;
}

编译程序会首先将.pc文件转换成.c文件然后在进行编译。
dchg2000 2004-09-18
  • 打赏
  • 举报
回复
老兄:
*.pc已经是写好的pc文件了,
最后不要改,再说它也不是C文件呀
建议你先看看proc的原理
NewCenturyNewPage 2004-09-17
  • 打赏
  • 举报
回复
dchg2000(偏爱小龙女)
-------------------------

我把你的整个代码整理成一个文件 ora_api.h,
我在使用你这个头文件的时候,#include "ora_api.h"

编译提示错误:
In file included from test.c:1:
oraapi.h:27:19: sqlca.h: No such file or directory
oraapi.h:28:19: sqlda.h: No such file or directory
oraapi.h:29:20: sqlcpr.h: No such file or directory
In file included from test.c:1:
oraapi.h:168:21: ora_api.h: No such file or directory
test.c:6:1: warning: no newline at end of file
怎么回事?


几个头文件都找不到了?
dchg2000 2004-09-17
  • 打赏
  • 举报
回复
第一个文件是头文件,自己写的,用于在使用前函数声明
第二个文件是pc文件,需要编译成.c文件,然后做成.so库
第三个文件是测试demo文件
dchg2000 2004-09-17
  • 打赏
  • 举报
回复
/*--

Copyright (c) 2003 Shenzhen Surfilter Network Technology Co.Ltd

File Name:
testora.c
Version:
1.0
Abstract:
Source code (Pro*C) for Oracle development.
Author:
Gang He
Created on:
2004-03-15
Modified History:

Modified Person:

--*/

#include "ora_api.h"


int main()
{ int lp;
int rs;
int i, k;
char var[16];
int pi[25];
char var1[25][16];
ORASQL con1, con2;
ORASQL_RES res1, res2;
ORASQL_ROW row1, row2;

rs = ora_connect(&con1, "system", "manager", "bb016");
printf("connect rs = %d\n", rs);

rs = ora_connect(&con2, "system", "manager", "bb016");
printf("connect rs = %d\n", rs);

for (lp = 0; lp < 100000000; lp++) {
usleep(2);

rs = ora_query(&con1, "select aa, bb, cc, to_char(dd, 'yyyy-mm-dd hh24:mi:ss') from mytb where aa < 50", &res1);
printf("lp = %d query rs = %d\n", lp, rs);

i = 0;
do
{

rs = ora_fetch_row(&con1, &res1, &row1);
if ( rs == 0 ) {


if ( lp % 1000 == 0 )
{
printf("fetch row %d \n", i++);
printf("row num = %d \n", row1.num);
for (k = 0; k < row1.num; k++)
printf("%s\t", row1.field[k]);
printf("\n\n");

}

} else
break;

} while ( 1 );

rs = ora_free_result(&con1, &res1);
printf("free result rs = %d\n", rs);

}

rs = ora_close(&con1);
printf("close rs = %d\n", rs);

rs = ora_close(&con2);
printf("close rs = %d\n", rs);


return 0;
}


NewCenturyNewPage 2004-09-17
  • 打赏
  • 举报
回复
很好的代码啊,谢谢 dchg2000(偏爱小龙女) !!!

完整的标准和 ORACLE 交互的代码就是这些了吧?
dchg2000 2004-09-17
  • 打赏
  • 举报
回复
/*--

Copyright (c) 2003 Shenzhen Surfilter Network Technology Co.Ltd

File Name:
ora_api.pc
Version:
1.0
Abstract:
Source code (Pro*C) for Oracle development.
Author:
Gang He
Created on:
2004-03-15
Modified History:

Modified Person:

--*/

#include "ora_api.h"


/* Define sql error dump of Oracle */
#define ora_sqlerror() printf("%.*s \n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc)


static int alloc_descriptors(ORASQL* con, ORASQL_RES* res)
{
int i;
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

res->select_da = SQLSQLDAAlloc(conn, MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN);
if ( res->select_da == NULL ) {
fprintf(stderr, "Fail to alloc for select_da \n");
return -1;
}

res->bind_da = SQLSQLDAAlloc(conn, MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN);
if ( res->bind_da == NULL ) {
fprintf(stderr, "Fail to alloc for bind_da \n");
return -1;
}

res->select_da->N = MAX_ITEMS;
res->bind_da->N = MAX_ITEMS;

for (i = 0; i < MAX_ITEMS; i++) {

res->select_da->I[i] = (short*)malloc(sizeof(short));
res->bind_da->I[i] = (short*)malloc(sizeof(short));

res->select_da->V[i] = (char*)malloc(1);
res->bind_da->V[i] = (char*)malloc(1);
}

return 0;
}


int ora_connect(ORASQL* con, const char* usr, const char* pwd, const char* sid)
{
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

EXEC SQL CONTEXT ALLOCATE :(*conn);
EXEC SQL CONTEXT USE :(*conn);
EXEC SQL CONNECT :usr IDENTIFIED BY :pwd USING :sid;

if ( sqlca.sqlcode == 0 ) {
printf("Connection succeed !\n");
return 0;
}
else {
ora_sqlerror();
return -1;
}
}


int ora_close(ORASQL* con)
{
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

EXEC SQL CONTEXT USE :(*conn);
EXEC SQL COMMIT WORK RELEASE;
EXEC SQL CONTEXT FREE :(*conn);

if ( sqlca.sqlcode == 0 ) {
printf("Close succeed !\n");
return 0;
}
else {
ora_sqlerror();
return -1;
}
}


int ora_query(ORASQL* con, const char* sqlbuf, ORASQL_RES* res)
{
int rs;
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

if ( (strncmp(sqlbuf, "SELECT", 6) == 0) || (strncmp(sqlbuf, "select", 6) == 0) ) {

/* Distribute memory for select and bind descriptors */
if ( alloc_descriptors(conn, res) != 0 )
return -1;

/* Deal with "select" statement */
return (ora_select(conn, sqlbuf, res));
}
else {
EXEC SQL CONTEXT USE :(*conn);
EXEC SQL EXECUTE IMMEDIATE :sqlbuf;

if ( sqlca.sqlcode >= 0 ) {
printf("Query succeed !\n");

rs = sqlca.sqlerrd[2];
EXEC SQL COMMIT WORK;
return rs;
}
else {
ora_sqlerror();
return -1;
}
}
}


int ora_select(ORASQL* con, const char* sqlbuf, ORASQL_RES* res)
{
int i;
int null_ok;
int precision, scale;
SQLDA* selectda;
SQLDA* bindda;
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

selectda = res->select_da;
bindda = res->bind_da;

EXEC SQL WHENEVER NOT FOUND GOTO select_error;
EXEC SQL WHENEVER SQLERROR GOTO select_error;

EXEC SQL CONTEXT USE :(*conn);
/* (void)setjmp(jmp_continue); */

/* Parse SQL statement */
EXEC SQL PREPARE S FROM :sqlbuf;

/* Declare cursor */
EXEC SQL DECLARE C CURSOR FOR S;

/* Open curse */
EXEC SQL OPEN C USING DESCRIPTOR bindda;

/* Get selected columns */
EXEC SQL DESCRIBE SELECT LIST FOR S INTO selectda;

if ( selectda->F < 0 ) {
fprintf(stderr, "Too many select_list items \n");
return -1;
}

selectda->N = selectda->F;

for (i = 0; i < selectda->F; i++) {

/* Cleanup NULL/NOT NULL status flag */
SQLColumnNullCheck(conn, &(selectda->T[i]), &(selectda->T[i]), &null_ok);

switch( selectda->T[i] )
{

case 1: /* CHAR */
break;

case 2: /* NUMBER */
SQLNumberPrecV6(conn, &(selectda->L[i]), &precision, &scale);
if ( precision == 0 )
precision = 40;

/* 考虑小数点和符号位 */
selectda->L[i] = precision + 2;
break;

case 8: /* LONG */
selectda->L[i] = 240;
break;

case 11: /* ROWID */
selectda->L[i] = 18;
break;

case 12: /* DATE */
selectda->L[i] = 30;
break;

case 23: /* RAW */
break;

case 24: /* LONG RAW */
selectda->L[i] = 240;
break;

} /* end switch */

selectda->V[i] = (char*) realloc(selectda->V[i], selectda->L[i] + 1);
memset(selectda->V[i], 0, selectda->L[i] + 1);

/* Convert other type to char type */
if ( selectda->T[i] != 24 )
selectda->T[i] = 1;

} /* end for */

res->select_da = selectda;
res->bind_da = bindda;

return 0;
select_error:
return -1;
}


int ora_fetch_row(ORASQL* con, ORASQL_RES* res, ORASQL_ROW* row)
{
int i, j;
SQLDA* selectda;
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

selectda = (res->select_da);

EXEC SQL WHENEVER NOT FOUND GOTO not_found;
EXEC SQL WHENEVER SQLERROR GOTO not_found;
EXEC SQL CONTEXT USE :(*conn);
EXEC SQL FETCH C USING DESCRIPTOR selectda;

memset(row->field, 0, sizeof(row->field));
row->num = selectda->F;

for (i = 0; i < row->num; i++) {

if ( (selectda->L[i] + 1) > strlen(selectda->V[i]) )
j = strlen(selectda->V[i]);
else {
selectda->V[i] = (char*)realloc(selectda->V[i], selectda->L[i] + 1);
j = selectda->L[i];
}
selectda->V[i][j] = '\0';

for (j = (strlen(selectda->V[i]) - 1); j >= 0; j--) {
if ( selectda->V[i][j] == ' ' )
selectda->V[i][j]= '\0';
else
break;
}

sprintf(row->field[i], selectda->V[i]);
}

return 0;
not_found:
return -1;
}


int ora_free_result(ORASQL* con, ORASQL_RES* res)
{
int i;
SQL_CONTEXT* conn;

conn = (SQL_CONTEXT*)con;

EXEC SQL WHENEVER SQLERROR GOTO free_error;
EXEC SQL CONTEXT USE :(*conn);

for (i = 0; i < MAX_ITEMS; i++) {

if ( res->bind_da->V[i] != NULL )
free(res->bind_da->V[i]);
if ( res->bind_da->I[i] != NULL )
free(res->bind_da->I[i]);

if ( res->select_da->V[i] != NULL )
free(res->select_da->V[i]);
if ( res->select_da->I[i] != NULL )
free(res->select_da->I[i]);
}

SQLSQLDAFree(conn, res->bind_da);
SQLSQLDAFree(conn, res->select_da);

EXEC SQL CLOSE C;
EXEC SQL COMMIT WORK;

return 0;
free_error:
return -1;
}

dchg2000 2004-09-17
  • 打赏
  • 举报
回复
/*--

Copyright (c) 2003 Shenzhen Surfilter Network Technology Co.Ltd

File Name:
ora_api.h
Version:
1.0
Abstract:
Definitions for operating Oracle database.
Author:
Gang He
Created on:
2004-03-15
Modified History:

Modified Person:

--*/

#ifndef _HEGANG_ORA_API_H
#define _HEGANG_ORA_API_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <sqlda.h>
#include <sqlcpr.h>
#include <setjmp.h>

#ifdef __cplusplus
extern "C" {
#endif


/* Define maximal columns or maximal binded variables of table */
#define MAX_ITEMS 40

/* Define maximal length of selected column name or binded variable name */
#define MAX_VNAME_LEN 30

/* Define maximal length of indication variable name */
#define MAX_INAME_LEN 30

/* Define connection handle of Oracle */
typedef void* ORASQL;

/* Define result handle of Oracle */
typedef struct {
SQLDA* select_da;
SQLDA* bind_da;
} ORASQL_RES;

/* Define record handle of Oracle */
typedef struct {
int num;
char field[MAX_ITEMS][512];
} ORASQL_ROW;


/*-
Name:
int ora_connect(ORASQL* con, const char* usr, const char* pwd, const char* sid)
Description:
Connect to Oracle database.
Input Parameters:
usr: user name
pwd: user password
sid: service id
Output Parameters:
con: connection handle
Return Value:
0, otherwise -1 is returned if an error occurred
-*/
int ora_connect(ORASQL* con, const char* usr, const char* pwd, const char* sid);


/*-
Name:
int ora_close(ORASQL* con)
Description:
Close connection to Oracle database.
Input Parameters:
con: connection handle
Output Parameters:
nothing
Return Value:
0, otherwise -1 is returned if an error occurred
-*/
int ora_close(ORASQL* con);


/*-
Name:
int ora_query(ORASQL* con, const char* sqlbuf, ORASQL_RES* res)
Description:
Query Oracle database.
Input Parameters:
con: connection handle
sqlbuf: sql statement
Output Parameters:
res: returned result handle
Return Value:
the number of records affected, otherwise -1 is returned if an error occurred
-*/
int ora_query(ORASQL* con, const char* sqlbuf, ORASQL_RES* res);


/*-
Name:
int ora_fetch_row(ORASQL* con, ORASQL_RES* res, ORASQL_ROW* row)
Description:
Fetch record from result handle.
Input Parameters:
con: connection handle
res: result handle
Output Parameters:
row: record handle
Return Value:
0, otherwise -1 is returned if an error occurred
-*/
int ora_fetch_row(ORASQL* con, ORASQL_RES* res, ORASQL_ROW* row);


/*-
Name:
int ora_free_result(ORASQL* con, ORASQL_RES* res)
Description:
Free result handle.
Input Parameters:
con: connection handle
res: result handle
Output Parameters:
nothing
Return Value:
0, otherwise -1 is returned if an error occurred
-*/
int ora_free_result(ORASQL* con, ORASQL_RES* res);


#ifdef __cplusplus
}
#endif

#endif

stgd 2004-09-17
  • 打赏
  • 举报
回复
pro*c

exec sql connect :usrname identified by :passwd using :srvname;
NewCenturyNewPage 2004-09-17
  • 打赏
  • 举报
回复
dchg2000(偏爱小龙女)
----------------------

有一个问题:怎么在*.pc 文件里面不能使用localtime()这个函数,也不能使用time_t 时间时间类型?

那个*.pc 文件是做什么用的? 你能给一个示例吗?
dchg2000 2004-09-17
  • 打赏
  • 举报
回复
你看看,他们不是在oracle下的一个目录吗?
还有你还是先编译一下*.pc文件,
看看proc*.c
Xeroo 2004-09-16
  • 打赏
  • 举报
回复
oracle提供了两套机制
一个是pro*c 预编译机制
一个是oci/occi 是一套完整的连接oracle用的 C库/C++类库
lihua9666 2004-09-16
  • 打赏
  • 举报
回复
oracle应该给你提供了访问他的api调用api即可
tibet 2004-09-16
  • 打赏
  • 举报
回复
用proc吧
上面的好象不是具体的代码啊
hanxian 2004-09-15
  • 打赏
  • 举报
回复
就像上面这样就可以联了吗??????
hanxian 2004-09-15
  • 打赏
  • 举报
回复

/* Result Sets Interface */
#ifndef SQL_CRSR
# define SQL_CRSR
struct sql_cursor
{
unsigned int curocn;
void *ptr1;
void *ptr2;
unsigned int 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[51];
};
static const struct sqlcxp sqlfpn =
{
50,
"C:\\Documents and Settings\\Administrator\\桌面\\q.txt"
};


static unsigned int sqlctx = 1653460308;


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;
unsigned int sqlcmax;
unsigned int sqlcmin;
unsigned int sqlcincr;
unsigned int sqlctimeout;
unsigned int sqlcnowait;
int sqfoff;
unsigned int sqcmod;
unsigned int sqfmod;
void *sqhstv[1];
unsigned int sqhstl[1];
int sqhsts[1];
void *sqindv[1];
int sqinds[1];
unsigned int sqharm[1];
unsigned int *sqharc[1];
unsigned short sqadto[1];
unsigned short sqtdso[1];
} sqlstm = {12,1};

/* SQLLIB Prototypes */
extern void sqlcxt (void **, unsigned int *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlcx2t(void **, unsigned int *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlbuft(void **, char *);
extern void sqlgs2t(void **, char *);
extern void sqlorat(void **, unsigned int *, 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[] =
{12,4130,852,0,0,
};


vollin 2004-09-14
  • 打赏
  • 举报
回复
首先要有oracle客户端,然后就可以用pro*c来程序,用proc编译就可以得到.c的源文件。然后就可以用了。
Xeroo 2004-09-14
  • 打赏
  • 举报
回复
或者pro*c
我现在用的是occi
加载更多回复(3)

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧