您好,欢迎访问一九零五行业门户网

Linux下C语言访问Oracle数据库Demo

前提条件 1. linux环境已经存在,安装好了oracle 本demo 运行环境本地环境 redhat linux as 4 ,oracle 10g本地数据库sid orc
前提条件
 1. linux环境已经存在,,安装好了oracle
 本demo 运行环境
本地环境     redhat linux as 4 ,oracle 10g
本地数据库sid orcl,ip:127.0.0.1,用户名:kingbi,密码:kingbi,表dsd_test. 显示表dsd_test 的所有记录.
步骤:
(1) 创建表 create table dsd_test(aa char(3)); insert into dsd_test  values('123');insert into dsd_test  values('456');
      被配置本地命名服务($oracle_home/network/admin/tnsnames.ora
     orcl =
  (description =
    (address = (protocol = tcp)(host = localhost.localdomain)(port = 1521))
    (connect_data =
      (server = dedicated)
      (service_name = orcl)
    )
  )
(2) 修改配置文件 /etc/profile (用root用户修改,增加 2句代码
      ...
      export path user logname mail hostname histsize inputrc
      export oracle_home=........                                                          #以下2行为新加
      export ld_library_path=$oracle_home/lib:/usr/lib          #这句很关键
       .....
(3) 更改$oracle_home/precomp/admin/pcscfg.cfg (include= 开头的语句为新加的,,/usr/lib/gcc/i386-redhat-linux/3.4.3/include 也是新加的)
sys_include=(/ade/aime_rdbms_9819/oracle/precomp/public,/usr/include,/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include,/usr/lib/gcc-lib/i386-redhat-linux7/2.96/include,/usr/lib/gcc/i386-redhat-linux/3.4.3/include)
include=$oracle_home/lib
include=$oracle_home/precomp/precomp/include
include=$oracle_home/precomp/oracore/include
include=$oracle_home/precomp/oracore/public
include=$oracle_home/precomp/rdbms/include
include=$oracle_home/precomp/rdbms/public
include=$oracle_home/precomp/rdbms/demo
include=$oracle_home/precomp/nlsrtl/include
include=$oracle_home/precomp/nlsrtl/public
include=$oracle_home/precomp/network_src/include
include=$oracle_home/precomp/network_src/public
include=$oracle_home/precomp/network/include
include=$oracle_home/precomp/network/public
include=$oracle_home/precomp/plsql/public
ltype=short
(4) 编写c 程序 test.pc文件
#include
exec sql include sqlca;
int main()
{
     //声明sql变量
     exec sql begin declare section;
     varchar user[20],pass[20],tnsname[20];
     //varchar预编译后为struct { unsigned short len; unsigned char arr[20];}
     char ename[20];
     exec sql end declare section;
     //声明结束
     int i=0;
     strcpy(user.arr,kingbi);
     user.len=(unsigned short)strlen((char *)user.arr);
     strcpy(pass.arr,kingbi);
     pass.len=(unsigned short)strlen((char *)pass.arr);
     strcpy(tnsname.arr,orcl);
     tnsname.len=(unsigned short)strlen((char *)tnsname.arr);
     //连接数据库
     exec sql connect :user identified by :pass using :tnsname;
    //执行查询
    exec sql declare emp_cursor cursor for
     select aa from kingbi.test;          
     exec sql open emp_cursor;
     exec sql whenever not found do break;
     while(1)
     {
           exec sql fetch emp_cursor into :empno,:ename;
           printf(the name is %s\n,ename);
           i=i+1;
     }
printf(yeah!we get %d records\n,i);
     exec sql close emp_cursor;
     exec sql commit work release;
}
(5) 预编译 ,编译后会生成 .c文件
proc test.pc
(6)编译
gcc -o test test.c $oracle_home/lib/libclntsh.so
(6) 运行生成的可执行文件
./test
输出:
the name is 123               
the name is 456               
yeah!we get 2 records
其它类似信息

推荐信息