Heim  >  Artikel  >  Datenbank  >  Linux操作系统下的Oracle数据库编程详解_MySQL

Linux操作系统下的Oracle数据库编程详解_MySQL

WBOY
WBOYOriginal
2016-06-01 14:02:591239Durchsuche

1.引言

由于PL/SQL不能用来开发面向普通用户的应用程序,必须借助其他语言或开发工具。在Linux操作系统下应该用什么语言或开发工具来进行Oracle数据库应用的开发呢?本文将介绍2种方案:Pro*C、JDBC。而另一种SQLJ方法,限于篇幅省略。

2. 环境设置

2.1 软件环境

本文的实验环境是在Red Hat Linux 8.0操作系统下,因为Oracle 9i要求至少512MB内存,所以我们选择Oracle 8.1.7.0.1作为数据库环境。说明一点:Oracle 8i的典型安装不包括Pro*C,需要在定制安装方式下将开发工具中的Pro*C选中。我们选择安装JDK的版本是J2SE 1.4.1 For Linux,其实JDK 1.1.6以上版本都可以。

2.2 Oracle用户的环境变量设置

为了方便,本文的操作都是以Oracle用户登录的。在Oracle用户的.bash_profile文件中必须包含以下行:

<ccid_code>#JAVA环境设置
export CLASSPATH=.:/usr/local/java/lib:/usr/local/jre/lib
export JAVA_HOME=/usr/local/java
#Oracle数据库环境设置
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE
export ORACLE_SID=MyDB
export ORACLE_TERM=vt100
export ORACLE_OWNER=oracle
export TNS_ADMIN=$ORACLE_HOME/network/admin
#设置JDBC和SQLJ的编译和运行环境
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/jdbc/lib/nls_charset11.zip
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/sqlj/lib/runtime12.zip
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/sqlj/lib/translator.zip
#设置搜索路径
export PATH=$PATH:/usr/local/java/bin:/usr/local/jre/bin:/bin:/sbin
            export PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:$ORACLE_HOME/bin</ccid_code>

2.3 建立实验用户和数据表

建立一个新的Oracle用户test,然后在新用户下建一个记录学生成绩的student表,该表很简单,只有三个字段:id、name、score。

<ccid_code>$sqlplus system/manager
SQL>create user test identified by test default tablspace users;
SQL>grant connect to test;
SQL>grant resource to test;
SQL>connect test/test;
SQL>create table student(id number,name varchar2(20),score number);
            SQL>insert into test values(1,’zhang’,95);</ccid_code>

向student表中添加一些实验数据。

3.Pro*C编程

Oracle的Pro*C预编译器是一个可以让你在C语言源程序中嵌入SQL语句的编程工具。Pro*C预编译器在预编译过程中,将嵌入的SQL语句转换成对标准Oracle运行库的调用,从而生成预编译过的源代码,然后再进行通常的编译、连接后就可以运行了。Oracle Pro*c预编译器使我们可以在应用程序中使用强大灵活的SQL,通过这个接口,我们就可以用我们的C语言程序直接访问Oracle数据库。

用Pro*c编程分为三步:

(1) 首先建立后缀名为.pc的内嵌SQL语句的C源程序文件;

$vi stu.pc

(2) 对源程序stu.pc进行预编译,生成单纯的C源程序stu.c

$proc PARSE=NONE stu.pc

(3) 编译该C程序,并加入Oracle的客户端动态链接库 ,生成可执行文件stu

$gcc –o stu stu.c $ORACLE_HOME/lib/libclntsh.so

以下是stu.pc的源程序,该程序的功能是根据用户输入的ID号,查询student表中学生的姓名和成绩。

<ccid_code>#include <stdio.h>
EXEC SQL INCLUDE SQLCA;
void main()
{
  /*声明宿主变量*/
  EXEC SQL BEGIN DECLARE SECTION;
  VARCHAR usr[20],pass[20],serv[20];
  char name[8];
  int id,score;
  EXEC SQL END DECLARE SECTION;
  /*设置连接数据库的用户名、密码和数据库服务名*/
  strcpy(usr.arr,"test");
  usr.len=(unsigned short)strlen((char *)usr.arr);
  strcpy(pass.arr,"test");
  pass.len=(unsigned short)strlen((char *)pass.arr);
  strcpy(serv.arr,"MyDB");
  serv.len=(unsigned short)strlen((char *)serv.arr);
  /*以test用户连接数据库*/
  EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
  printf("Connect!\n");
  /*用户输入欲查询的ID号*/
  printf("请输入学生代码:");
  scanf("%d",&id);
  /*执行动态的SQL查询语句*/
  EXEC SQL SELECT id,name,score into :id,
  :name,:score from student where id=:id;
  printf("Name=%s    Score=%d\n",name,score);
  /*提交事务并断开与数据库的连接*/
EXEC SQL COMMIT WORK RELEASE;
  printf("Disconnect!\n");
            }</stdio.h></ccid_code>

在Pro*C中遍历数据表中每一条记录的方法是通过声明游标来实现的,下面的例程stu2.pc便是一个使用游标的例子,其功能是显示student表中的每一条记录。

<ccid_code>#include <stdio.h>
EXEC SQL INCLUDE SQLCA;
void main()
{
  /*声明宿主变量*/
  EXEC SQL BEGIN DECLARE SECTION;
  VARCHAR usr[20],pass[20],serv[20];
  char name[8];
  int id,score;
  EXEC SQL END DECLARE SECTION;
  /*设置连接数据库的用户名、密码和数据库服务名*/
  strcpy(usr.arr,"test");
  usr.len=(unsigned short)strlen((char *)usr.arr);
  strcpy(pass.arr,"test");
  pass.len=(unsigned short)strlen((char *)pass.arr);
  strcpy(serv.arr,"MyDB");
  serv.len=(unsigned short)strlen((char *)serv.arr);
  /*以test用户连接数据库*/
  EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
  printf("Connect!\n");
  /*声明游标*/
  EXEC SQL DECLARE stu_cursor CURSOR FOR
  SELECT id,name,score from student;
  printf("DECLARE CURSOR OK!\n");
  /*打开游标*/
  EXEC SQL OPEN  stu_cursor;
  printf("OPEN CURSOR OK!\n");
  /*错误处理*/
  EXEC SQL WHENEVER NOT FOUND DO break;
  /*循环访问游标数据*/
  while(1)
  {
    EXEC SQL FETCH stu_cursor INTO :id,:name,:score;
    printf("Id=%d   Name=%s    Score=%d\n",id,name,score);
  }
  /*关闭游标*/
  EXEC SQL CLOSE stu_cursor;
  /*提交事务并断开与数据库的连接*/
  EXEC SQL COMMIT WORK RELEASE;
  printf("Disconnect!\n");
              }</stdio.h></ccid_code>

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn