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

哀沐蹄

哀沐蹄

2016-02-20 13:25

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的Linux操作系统下的Oracle数据库编程详解教程,一起来看看吧!超容易上手~

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文件中必须包含以下行:

#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

2.3 建立实验用户和数据表

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

$sqlplus system/manager
SQLcreate user test identified by test default tablspace users;
SQLgrant connect to test;
SQLgrant resource to test;
SQLconnect test/test;
SQLcreate table student(id number,name varchar2(20),score number);
            SQLinsert into test values(1,’zhang’,95);

向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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/diannaorumen/)

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

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

#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=%dn",name,score);
  /*提交事务并断开与数据库的连接*/
EXEC SQL COMMIT WORK RELEASE;
  printf("Disconnect!n");
            }

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

#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=%dn",id,name,score);
  }
  /*关闭游标*/
  EXEC SQL CLOSE stu_cursor;
  /*提交事务并断开与数据库的连接*/
  EXEC SQL COMMIT WORK RELEASE;
  printf("Disconnect!n");
              }
4. JDBC编程

在Linux下用JDBC访问Oracle数据库主要有以下几个技术要点:

(1) 注册

Oracle的JDBC驱动。有两种方式,一种是调用class.forName方法:
Class.forName("oracle.jdbc.driver.OracleDriver");

另一种是调用DriverManager类的registerDriver方法:

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

(2) 获取Oracle数据库的连接。也有两种方式。一是调用OCI驱动程序,OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。

Connection conn=DriverManager.
            getConnection("jdbc:oracle:oci8:@","test","test");

另一种方式是调用Thin驱动程序。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/diannaorumen/)

conn=DriverManager.getConnection
            ("jdbc:oracle:thin:@10.1.14.34:1521:MyDB","test","test");

为了获得最高的性能,Oracle公司建议在客户端软件的开发中使用OCI驱动程序。

(3) 建立Statament和结果集对象,执行SQL语句,结果返回到结果集。

Statement pstmt=conn.createStatement();
            ResultSet rset= pstmt.executeQuery(query)

(4) 处理结果集,显示数据。

以下是遍历student数据表的Java源程序Stu.java,源程序中包含了两种注册Oracle驱动的方式,以及OCI和Thin两种连接数据库的方法(因程序中不可能同时使用两种方法,所以另一种方法被注释)。

/* 导入Java类 */
import java.sql.*;
/* 主类 */
public class Stu
{
 public static void main(String argv[]) throws SQLException
 {
 /* 声明并初始化变量 */
 String query = new String("SELECT id,name,score FROM student");
 String name;
 int id,score;
 Connection conn=null;
 try{
 /*第一种注册JDBC的Oracle驱动的方法*/
 //Class.forName("oracle.jdbc.driver.OracleDriver");
/*第二种注册JDBC的Oracle驱动的方法*/
 DriverManager.registerDriver
(new oracle.jdbc.driver.OracleDriver());
 }catch(Exception e){
 System.out.println("Could not load drive:"+e);
 System.exit(-1);
}  
/*利用Thin驱动程序获取Oracle连接*/
 //conn=DriverManager.getConnection
("jdbc:oracle:thin:@10.1.14.34:1521:MyDB","test","test");
    //System.out.println("Connected with THIN CLIENT!");
    /*利用OCI驱动程序获取Oracle连接*/
    conn=DriverManager.getConnection
   ("jdbc:oracle:oci8:@","test","test");
    System.out.println("Connected with OCI8!n");
    /* 使用try ... catch抓取并处理例外 */
    try {
      Statement pstmt=conn.createStatement();
      /* 执行SQL语句 */
      ResultSet rset= pstmt.executeQuery(query);
      /* 循环处理JDBC结果集的数据 */
      while(rset.next()) {
        id=rset.getInt(1);
        name = rset.getString(2);
        score=rset.getInt(3);
        System.out.println("ID=" + id);
        System.out.println("NAME=" + name);
        System.out.println("SCORE=" + score);
        System.out.println("---------------");
      }
      /* 关闭JDBC结果集 */
      rset.close();
      /* 关闭动态SQL语句 */
      pstmt.close();
    }
    catch(SQLException e) {
      System.out.println("出现SQL例外:" + e.getMessage());
    }
    conn.close();
  }
}
    编译、执行上述源程序,可显示出student表中所有记录。
    $javac Stu.java
                $java Stu


5. 结束语

从Oracle公司的产品策略和发展趋势来看,Java将成为Oracle数据库最有力的工具。Oracle公司在Oracle 8i中引入JVM,并在Oracle 9i中已经发展得极为成熟。这使得我们不仅可以利用JDBC和SQLJ访问Oracle数据库,也可以在Oracle的PL/SQL中执行用Java编写的存储过程和函数,两者的结合是双向和无缝的。Java使Oracle正在成为一个平台无关的数据库,正如Oracle公司的发展目标所说的那样:没有操作系统,只有Oracle和Internet。

展开更多 50%)
分享

猜你喜欢

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

电脑入门
Linux操作系统下的Oracle数据库编程详解

MySQL数据库在主流操作系统下的同步

编程语言 网络编程
MySQL数据库在主流操作系统下的同步

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Oracle在Linux操作系统下安装小结

电脑网络
Oracle在Linux操作系统下安装小结

Linux操作系统下Oracle主要监控工具介绍

编程语言 网络编程
Linux操作系统下Oracle主要监控工具介绍

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Linux操作系统下IPTables配置方法详解

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux操作系统下IPTables配置方法详解

Linux 操作系统下的串行口通讯编程

编程语言 网络编程
Linux 操作系统下的串行口通讯编程

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

字体、字库深入详解及方正字库的分类

字体、字库深入详解及方正字库的分类

搭建Linux邮件网关与邮件系统

搭建Linux邮件网关与邮件系统
下拉加载更多内容 ↓