dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>操作系统>linux>文章内容
Oracle应用Linux开发C
来源:未知     作者:    
    Linux的不断完善与发展,出现了大量基于 Linux平台的应用开发,原有的基于UNIX平台的商业软件也不断被移植到Linux上来。最典型的,Oracle公司宣布,他的现有的及未来所有的产品和商业应用都将支持Linux平台。本文所述OCI for Linux的C语言库,正是Linux平台上的。
我们知道,在一个复杂的Oracle数据库应用中,C程序代码由于其语言本身的灵活性、高效性,往往被加入到其商务逻辑的核心层模块中。Oracle数据库对C语言的就是OCI(Oracle Common Interface) C-Library,该库是一个功能十分强大的操作模块。它支持事务处理,单事务中的多连接多数据源操作,支持数据的对象访问、的调用等一系列高级应用,并对Oracle下的多种附加产品提供。但是我们发现,为了使OCI库在多种平台上保持统一的风格并考虑向下兼容性,Oracle对大量的C语言类型和代码进行了重新封装,这使得OCI库初看上去显得纷繁复杂,初用者不知从何下手。由Kai Poitschke开发的Libsqlora8库初步解决了这一问题,它使得在Linux下的非高端开发变得比较方便易用。
Libsqlora8 for *nix是GNU/Linux组织开发的针对8 OCI library的易用性C语言封装。它将大量的OCI数据类型表现为通用数据类型,将OCI函数按类型重新分类封装,大大减少了的调用步骤和程序代码量。Libsqlora8还有许多引人注目的特性:
易于使用的动态SQL特性;
同一连接中具有不同变量绑定的游标的重复打开;
相同事务中的多连接;
应用开发中的Build-in trace功能;
正确处理数据插入操作中的数组变量问题;
多平台支持Oracle 8.0.4(HP-UX 9), Oracle 8.05(GNU/Linux), 8.1.6(GNU/Linux)等;
可以作为静态或动态形式链接进入应用程序。
下面我们分步骤详细阐述如何在Linux平台上利用Libsqlora8库开发应用。
1.安装Linux操作系统,并对新系统进行适当的系统配置。在本例中我们选用RedHat Linux 6.2。在为系统分区时,我们为Oracle数据库专门分出两个分区:/u01,/u02,作为Oracle数据库的系统软件和文件的安装点。安装好系统后,我们为系统增添两个新组:oinstall和dba,并创建一个新用户,他拥有整个系统软件。这里就不详细说明了。
2.下面我们应该安装Oracle数据库了,这次我们选用Oracle 8.1.6版本,该版数据库对国际化有很好的支持。在安装之前,我们要先对用户进行一些设置。主要是在该用户的启动脚本中,加入一些必要的环境变量,在本例中可以如下设置:
ORACLE_BASE=/u01/app/
ORACLE_HOME=$_BASE/product/8.1.6
_SID=oratest
PATH=$_HOME/bin:/usr/bin:/etc:/bin:/usr/local/bin:/usr/X11R6/bin
LD_LIBRARY_PATH=$_HOME/lib
export ORACLE_BASE ORACLE_HOME _SID PATH
3.Oracle 8.1.6的数据库安装是比较简单的,我们选择缺省安装,在系统的提示下逐一完成安装过程。注意,Oracle8i对系统的要求是比较高的,特别是内存,在一些特殊应用中,要修改系统的缺省设置以提高数据库性能。有关数据库调优的讨论与本文无关,在此就不再详细介绍了。启动数据库,好了,现在我们可以用sqlplus登录,可以看到,缺省安装的数据库有一类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=$_HOME/lib
$>export LD_LIBRARY_PATH
$>./configure
$>make
$>make install
对于要使用Oracle build-in trace功能的开发者,还要将以下环境变量设置好,SQLORA_TRACE_LEVEL,SOLORA_TRACE_FILE,SQLORA_ARRAYSIZE,当然,_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”在 SQL语句中表示为一个变量(名字随意),在sqlo_bind_by_name函数中与packet_name变量绑定。在变量绑定完毕后,就可以调用sqlo_execute来执行这个SQL语句。

 

 

上一篇:基于Linux的网络数据帧捕获方法与思考   下一篇:在 Linux 下建立软体套件
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·Linux常用基本命令及应用技巧
·写得蛮好的linux学习笔记
·学会在Linux下对硬盘分区
·找回Redhat的超级用户密码
·Linux下C语言编程
·GDB教程
·Cron服务配置详解
·Linux与Unix二大操作系统编程的
·Linux 2.6 内核的嵌入式系统应用
·Linux和Windows系统调用的比较
·vim命令(一)
·vim 命令(二)
  相关文章
·基于Linux的网络数据帧捕获方法
·在 Linux 下建立软体套件
·为 Linux 应用程序编写 DLL
·Linux下的动态连接库及其实现机
·Linux 最新稳定内核 2.4.x 的网
·Linux教程(3)-Linux纵览
·Linux 内核模块和驱动程序的编写
·Linux教程(4)-Linux的发展
·Linux 内核原代码 init/main 的
·Linux教程(5)-Linux特性
·Linux 内核原代码 boot.s 部分的
·Linux教程(6)-Linux与其他操作系
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763