随着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. exiting\n");
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: %s\n", sqlo_geterror(dbh));
return 0;
}
while (0 == sqlo_fetch(sd,1))
{ v = sqlo_values(sd, null, 1);
printf("result: %s\n",v);
}
if (0 > sqlo_close(sd))
{ printf("sqlo_open failed: %s\n", sqlo_geterror(dbh));
return 0;
}
以上例子展示了第一种查询方法,显然,这种方法较简单,但不够灵活。
char *update_stmt =
"update ocitest.upload_log set upload_fresh = '0' where log_name = :1";
if (0 <= (sth = sqlo_prepare(dbh, update_stmt)))
{ if (sqlo_success !=
(sqlo_bind_by_name(sth, ":1", sqlot_str, packet_name, 64, null, 0)
))
{ printf("sqlo_bind_param failed failed: %s\n", sqlo_geterror(dbh) );
return 0;
}
}
if (sqlo_success != sqlo_execute(sth, 1))
{ printf("sqlo_execute failed: %s\n", 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
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器