Linux下的Oracle编程技术.pdf
Linux 下的 Oracle 编程技术李俊平 薛海燕 周光明深圳职业技术学院计算机应用工程系,广东深圳 518055Tearfalls 手打,本文版权归原作者所有摘要:本文探讨了在 Linux 操作系统下用 C 和 Java 语言访问 Oracle 数据库的几种方法,通过实例源代码的形式介绍了 Pro*C、JDBC 和 SQLJ 等关键技术的简单原理以及在 Oracle 数据库编程中的实际应用。关键词:Oracle;Pro*C;JDBC;SQLJ中图分类号:TP39;文献标识码:BProgramming For Oracle On Linux SystemLILILILI Jun-PingJun-PingJun-PingJun-Ping XueXueXueXue Hai-YanHai-YanHai-YanHai-Yan ZhouZhouZhouZhou Guang-MingGuang-MingGuang-MingGuang-MingAppliedAppliedAppliedApplied ComputerComputerComputerComputer EngineeringEngineeringEngineeringEngineering DepartmentDepartmentDepartmentDepartment ofofofof ShenzhenShenzhenShenzhenShenzhen PolytechnicPolytechnicPolytechnicPolytechnic ShenzhenShenzhenShenzhenShenzhen 518055518055518055518055Abstract:Abstract:Abstract:Abstract:This article discuss several methods of querying Oracle database by using C and Javalanguage on Linux,introduce the technology of Pro*C,JDBC and SQLJ and its applications in Oracledatabase programming.Keywords:Keywords:Keywords:Keywords:Oracle;Pro*C;JDBC;SQLJ1 引言Oracle 数据库系统功能强大而完善,是在关键业务中运用最为广泛的数据库系统。在 Oracle 数据库系统中,我们一般是利用 PL/SQL 语言编制各种脚本来完成数据库的日常维护、备份、优化等管理工作。但是,由于 PL/SQL 是一种 Oracle 数据库系统内置的脚本语言,所以不能用来开发面向普通用户的应用程序,发布借助其他语言或开发工具。在 Windows 操作系统下,我们可以用 VB、Delphi 等可视化开发工具配合 ODBC 或ADO 等中间件来开发 Oracle 数据库的前端应用程序。那么在 Linux 操作系统下应该用什么语言或开发工具来进行 Oracle 数据库应用的开发呢?本文将介绍人三种方案:Pro*C、JDBC 和 SQLJ。2 环境设置(1)软件设置本文的实验环境是在 Red Hat Linux 8.0 操作系统下,Oracle 8.1.7.0.1 作为数据库环境。Oracle 8i 在 Linux下的安装已经有很多文章谈及,这里只说明一点,就是 Oracle 8i 的典型安装不包括 Pro*C,需要在定制安装方式下将开发工具中的 Pro*C 选中。JDK 笔者安装的是 J2SE 1.4.1 For Linux。(2)Oracle 用户的环境变量设置为了方便,本文的操作都是在 Linux 下以 Oracle 用户登录的。在 Oracle 用户的.bash_profile 文件中必须设置 JAVA 环境(Java 主目录)、JDBC 和 SQLJ 的编译和运行环境(Java 相关库的路径)以及搜索路径(Java和 Oracle 目录中的 bin 目录)。(3)建立实验用户和数据建立一个新的 Oracle 用户 test,然后在新用户下建一个记录学生成绩的 student 表,该表很简单,只有三个字段:id、name、score。然后向 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 表中学生的姓名和成绩。#include EXEC SQL INCLUDE SQLCA;Void main()EXEC SQL BEGIN DECLARE SECTION;/*声明宿主变量*/VARCHAR usr20,pass20,serv20;char name8;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);EXEC SQL CONNECT:usr IDENTIFIED BY:pass USING:serv;/*连接数据库*/printf(“Connect!n”);printf(“请输入学生代码:”);/*用户输入欲查询的 ID 号*/scanf(“%d”,&id);/*执行动态的 SQL 查询语句*/EXEC SQL SELECT id,name,score into:id,:name,:score from student where id=:id;printf(“Name=%sScore=%d n”,name,score);EXEC SQL COMMIT WORK RELEASE;/*提交事务并断开与数据库的连接*/printf(“Disconnect!n”);在 Pro*C 中遍历数据表中每一条记录的方法是通过声明游标来实现的,下面的例程 stu2.pc 便是一个使用游标的例子,其功能是显示 student 表中的每一条记录。#include EXEC SQL INCLUDE SQLCA;void main()/*连接数据库的代码同上一个程序,这里略去*/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=%dName=%sScore=%d n”,id,name,score);EXEC SQL CLOSE stu_cursor;/*关闭游标*/EXEC SQL COMMIT WORK RELEASE;/*提交事务并断开与数据库的连接*/printf(“Disconnect!n”);4 JDBC 编程JDBC 是一种可用于执行 SQL 语句的 Java API(Application Programming Interface)。它由一些 Java 语言编写的类和界面组成。JDBC 为数据库开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯 Java 语言编写完整的数据库应用程序。在 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 驱动程序,它直接与数据库进行通讯。Connection conn=DriverManager.getConnection(“jdbc:oracle:thin:10.1.14.34:1521:MyDB”,“test”,“test”);为了获得最高的性能,Oracle 公司建议在客户端软件的开发中使用 OCI 驱动程序。(3)建立 Statement 和结果集对象,执行 SQL 语句,结果返回到结果集。Statement pstmt=conn.createStatement();ResultSet rset=pstmt.executeQuery(query);(4)处理结果集,显示数据。以下是遍历 student 数据表的 Java 源程序 Stu.java,源程序中包含了两种注册 Oracle 驱动的方式,以及OCI 和 Thin 两种连接数据库的方法(因程序中不可能同时使用两种方法,所以另一种方法被注释)。import java.sql.*;/*导入 Java 类*/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 driver:”+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!n”);/*利用 OCI 驱动程序获取 Oracle 连接*/conn=DriverManager.getConnection(“jdbc:oracle:oci8:”,“test”,“test”);System.out.println(“Connected with OCI8!n”);try Statement pstmt=conn.createStatement();ResultSet rset=pstmt.executeQuery(query);/*执行 SQL 语句*/while(rset.next()/*循环处理 JDBC 结果集的数据*/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(“-“);rset.close();/*关闭 JDBC 结果集*/pstmt.close();/*关闭动态 SQL 语句*/catch(SQLException e)System.out.println(“出现 SQL 例外:”+e.getMessage();conn.close();编译、执行上述源程序,可显示出 student 表中所有记录。$javac Stu.java$java Stu5 SQLJ 编程为了提供一种简单、易用、基于数据库的 Java 应用开发工具,一些大的关系数据库厂商(IBM、Oracle、Sybase 等)联合制订了 SQLJ 标准,其最大特点就是允许将 SQL 语句内嵌到 Java 代码中,从而简化了 Java数据库应用程序的开发方法。做为数据库及相应开发工具的领头羊,Oracle 公司不仅协助制订了 SQLJ 标准,而且在 Oracle8i 中率先实现了对 SQLJ 标准的支持。SQLJ 是在 Java 源程序中嵌入 SQL 语句的一种编程方式,这种方式和前面介绍的 Pro*C 极为类似,只不过宿主语言由 C/C+换成了 Java。SQLJ 由于 SQLJ 预编译器(SQLJ Translator)和 SQLJ 运行时(SQLJ Runtime)组成。SQLJ 预编译器用于将内嵌 SQL 代码转换为 Java 代码。SQLJ 运行时用于实现 SQLJ 应用程序中的内嵌 SQL 操作,当运行 SQLJ应用程序时,系统会自动调用 SQLJ 运行器。和 Pro*C 一样,用 SQLJ 编程访问 Oracle 数据库也分为三个步骤:(1)建立内嵌 SQL 语句的 Java 源程序文件,其后缀名为.sqlj。例如:$vi Student.sqlj(2)利用 SQLJ 预编译器编译上述源文件,生成纯 java 源程序 Student.java。$sqlj Student.sqlj下面的基于 SQLJ 源程序功能和上述的基于 JDBC 的程序一样,也是遍历 student 数据表中的每一条记录,并将其显示在屏幕上。/*Student.sqlj 源程序*/import java.sql.SQLException;/*导入所需的 Java 类*/import sqlj.runtime.*;/Java 运行时支持import sqlj.rumtime.ref.*;import oracle.sqlj.rumtime.*;/Oracle 扩展#sql iterator MyIter(int id,String name,int score);/*定义 iterator 处理结果集*/class Student/*主类*/public static void main(String args)try/*连接到 Oracle 数据库,这里使用的是 Thin 驱动程序*/Oracle.connect(jdbc:oracle:thin:10.1.14.34:1521:MyDB,test,test);Student st=new Student();st.runExample();catch(SQLException e)System.err.println(Error running the example:+e);finally try Oracle.close();catch(SQLException e)void runExample()throws SQLException/*定义 runExample 函数获取并处理结果*/MyIter iter;/*声明 iterator 类的一个实例*/#sql iter=SELECT id,name,score FROM student;/*执行嵌入的 SQL 语句,并返回结果给iterator*/while(iter.next()/*循环遍历结果的每一条记录并输出*/System.out.println(ID=+iter.id();System.out.println(NAME=+iter.name();System.out.println(SCORE=+iter.score();(3)编译生成的纯 Java 源代码,生成 Java 程序并执行。此处不再累述