分享
 
 
 

Oracle应用Linux开发C

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

随着Linux操作系统的不断完善与发展,出现了大量基于 Linux平台的应用开发,原有的基于UNIX平台的商业软件也不断被移植到Linux上来。最典型的,Oracle公司宣布,他的现有的及未来所有的数据库产品和商业应用都将支持Linux平台。本文所述OCI for Linux的C语言库,正是Linux平台上Oracle的C语言接口。

我们知道,在一个复杂的Oracle数据库应用中,C程序代码由于其语言本身的灵活性、高效性,往往被加入到其商务逻辑的核心层模块中。Oracle数据库对C语言的接口就是OCI(Oracle Common Interface) C-Library,该库是一个功能十分强大的数据库操作模块。它支持事务处理,单事务中的多连接多数据源操作,支持数据的对象访问、存储过程的调用等一系列高级应用,并对Oracle下的多种附加产品提供接口。但是我们发现,为了使OCI库在多种平台上保持统一的风格并考虑向下兼容性,Oracle对大量的C语言类型和代码进行了重新封装,这使得OCI库初看上去显得纷繁复杂,初用者不知从何下手。由Kai Poitschke开发的Libsqlora8库初步解决了这一问题,它使得在Linux下Oracle的非高端C语言开发变得比较方便易用。

Libsqlora8 for *nix是GNU/Linux组织开发的针对Oracle8 OCI library的易用性C语言封装。它将大量的OCI数据类型表现为通用C语言数据类型,将OCI函数按类型重新分类封装,大大减少了函数的调用步骤和程序代码量。Libsqlora8还有许多引人注目的特性:

易于使用的动态SQL特性;

同一连接中具有不同变量绑定的游标的重复打开;

相同事务中的多数据库连接;

Oracle数据库应用开发中的Build-in trace功能;

正确处理数据插入操作中的数组变量问题;

多平台支持Oracle 8.0.4(HP-UX 9), Oracle 8.05(GNU/Linux), Oracle 8.1.6(GNU/Linux)等;

可以作为静态或动态形式链接进入应用程序。

下面我们分步骤详细阐述如何在Linux平台上利用Libsqlora8函数库开发Oracle数据库应用。

1.安装Linux操作系统,并对新系统进行适当的系统配置。在本例中我们选用RedHat Linux 6.2操作系统。在为系统分区时,我们为Oracle数据库专门分出两个分区:/u01,/u02,作为Oracle数据库的系统软件和数据库文件的安装点。安装好系统后,我们为系统增添两个新组:oinstall和dba,并创建一个新用户Oracle,他拥有整个数据库系统软件。这里就不详细说明了。

2.下面我们应该安装Oracle数据库了,这次我们选用Oracle 8.1.6版本,该版数据库对国际化有很好的支持。在安装数据库之前,我们要先对Oracle用户进行一些设置。主要是在该用户的启动脚本中,加入一些必要的环境变量,在本例中可以如下设置:

ORACLE_BASE=/u01/app/oracle

ORACLE_HOME=$ORACLE_BASE/product/8.1.6

ORACLE_SID=oratest

PATH=$ORACLE_HOME/bin:/usr/bin:/etc:/bin:/usr/local/bin:/usr/X11R6/bin

LD_LIBRARY_PATH=$ORACLE_HOME/lib

export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH

3.Oracle 8.1.6的数据库安装是比较简单的,我们选择缺省安装,在系统的提示下逐一完成安装过程。注意,Oracle8i对系统的要求是比较高的,特别是内存,在一些特殊应用中,要修改系统的缺省设置以提高数据库性能。有关数据库调优的讨论与本文无关,在此就不再详细介绍了。启动数据库,好了,现在我们可以用sqlplus登录数据库,可以看到,缺省安装的Oracle数据库有一类OCITest数据库表,就使用这些表作为我们例子中的缺省表。

4.安装Libsqlora8库函数。该库函数当前版本为Libsqlora8-2.1.5,可从许多Linux网站上得到,也可从http://www.china-linux.org上下载libsqlora8-2.1.5.tar.gz源程序包。按以下步骤安装:

$tar -xzvf libsqlora8-2.1.5.tar.gz

$cd libsqlora8-2.1.5

$LD_LIBRARY_PATH=$ORACLE_HOME/lib

$export LD_LIBRARY_PATH

$./configure

$make

$make install

对于要使用Oracle build-in trace功能的开发者,还要将以下环境变量设置好,SQLORA_TRACE_LEVEL,SOLORA_TRACE_FILE,SQLORA_ARRAYSIZE,当然,ORACLE_SID是一定要设好的。

5.下面,我们介绍一下Libsqlora8的主要函数。

1)int sqlo_init(int threaded_mode) 初始化程序库接口,读出环境变量,设置相应的全局变量。当前,threaded_mode设为0。

2)int sqlo_connect(int * dbh, char * connect_str) 连接数据库,dbh为数据库连接描述符,connect_str为用户名/口令字符串。

3)int sqlo_finish(int dbh) 断开数据库连接。

4)int sqlo_open(int dbh, char * stmt, int argc, char *argv[]) 打开由stmt确定的查询语句所返回的游标。Argc,argv为查询的参数,后面我们将用更清晰的方法传递参数。

5)int sqlo_close(int sth) 关闭由上一个函数打开的游标。

6)int sqlo_fetch(int sth) 从打开的游标中获取一条记录,并将之存入一个已分配内存空间中。

7)const char **sqlo_values(int sth, int *numbalues, int dostrip) 从内存中返回上一次sqlo_fetch取得的值,是以字符串形式返回的。

8)以下介绍另一种检索方式,int sqlo_prepare(int dbh, char const *stmt),返回一个打开的游标sth。

9)int sqlo_bind_by_name(int sth, const char * param_name, int param_type, const void * param_addr, unsigned int param_size, short * ind_arr, int is_array) 将查询语句的传入参数,按照名字的形式与函数中的变量绑定。如果你使用数组,那么参数param_addr和ind_arr必须指向该数组。

int sqlo_bind_by_pos(int sth, int param_pos, int param_type, const void * param_addr, unsigned int param_size, short * ind_arr, int is_array) 将查询语句的传出值,按照位置顺序与函数中的变量绑定。

10)int sqlo_execute(int sth, int iterations) 执行查询语句。“Iterations”可设为“1”。

11)在执行完数据库操作后,我们可用int sqlo_commit (int dbh)提交操作,或用int sqlo_rollback(int dbh)回滚操作。

12)Libsqlora8还有其他一些操作函数,这里就不一一列出了。

下面举几个例子说明这些函数如何使用。

cstr = "ocitest/ocitest"; //用户名/口令

status = sqlo_init(0);

if (SQLO_SUCCESS != status)

{ printf ("sql_init failed. Exitingn");

exit(1);

}

status = sqlo_connect(&dbh, cstr); // int dbh

以上源代码,显示了如何连接数据库。

/* Select all and display */

char *select_stmt="SELECT cname, clength, colid FROM ocicolu";

if (0(sd = sqlo_open(dbh, select_stmt, 0, NULL)))

{ printf("sqlo_open failed: %sn", sqlo_geterror(dbh));

return 0;

}

while (0 == sqlo_fetch(sd,1))

{ v = sqlo_values(sd, NULL, 1);

printf("Result: %sn",v);

}

if (0 sqlo_close(sd))

{ printf("sqlo_open failed: %sn", sqlo_geterror(dbh));

return 0;

}

以上例子展示了第一种查询方法,显然,这种方法较简单,但不够灵活。

char *update_stmt =

"UPDATE ocitest.upload_log SET upload_fresh = where log_name = :1";

if (0

{ if (SQLO_SUCCESS !=

(sqlo_bind_by_name(sth, ":1", SQLOT_STR, packet_name, 64, NULL, 0)

))

{ printf("sqlo_bind_param failed failed: %sn", sqlo_geterror(dbh) );

return 0;

}

}

if (SQLO_SUCCESS != sqlo_execute(sth, 1))

{ printf("sqlo_execute failed: %sn", sqlo_geterror(dbh) );

return 0;

}

上面的代码显示了如何通过名字绑定变量,“:1”在Oracle SQL语句中表示为一个变量(名字随意),在sqlo_bind_by_name函数中与packet_name变量绑定。在变量绑定完毕后,就可以调用sqlo_execute函数来执行这个SQL语句。

好了,我们已经向大家介绍了Libsqlora8的基本使用方法,如果希望了解更多内容,Libsqlora8的程序包中带有详细的说明和例子,大家不妨自己钻研一下。有什么心得,欢迎和我联系。E-mail:nick_chen@yeah.net

/*-------------------------------------------------------------------------

* testlora.c

* Test programm for libsqlora8(Kai Poitschke)

* Assuming you installed the library with prefix=/usr/local, the command

* to compile this is:

* gcc -o sample sample.c -lsqlora8 -L$ORACLE_HOME/lib -lclntsh

*-----------------------------------------------------------------------*/

#include

#include

#include

#include "sqlora.h"

#define MAX_ITERS 10

#define MAX_LOOPS 1 /* how many time we run the tests */

#define CLOSE_CURSOR 1

/*-------------------------------------------------------------------------

* create our test table

*-----------------------------------------------------------------------*/

int create_table( int dbh )

{

int nkey;

char ckey[6];

double nv

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有