.引言
由於PL/SQL不能用來開發面向普通用戶的應用程序必須借助其他語言或開發工具在Linux操作系統下應該用什麼語言或開發工具來進行Oracle數據庫應用的開發呢?本文將介紹2種方案Pro*CJDBC而另一種SQLJ方法限於篇幅省略
. 環境設置
軟件環境
本文的實驗環境是在Red Hat Linux 操作系統下因為Oracle i要求至少MB內存所以我們選擇Oracle 作為數據庫環境說明一點Oracle i的典型安裝不包括Pro*C需要在定制安裝方式下將開發工具中的Pro*C選中我們選擇安裝JDK的版本是JSE For Linux其實JDK 以上版本都可以
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=vt
export ORACLE_OWNER=oracle
export TNS_ADMIN=$ORACLE_HOME/network/admin
#設置JDBC和SQLJ的編譯和運行環境
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/jdbc/lib/classeszip
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/jdbc/lib/nls_charsetzip
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/sqlj/lib/runtimezip
export CLASSPATH=:$CLASSPATH:$ORACLE_HOME/sqlj/lib/translatorzip
#設置搜索路徑
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
建立實驗用戶和數據表
建立一個新的Oracle用戶test然後在新用戶下建一個記錄學生成績的student表該表很簡單只有三個字段idnamescore
$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 numbername varchar()score number);
SQL>insert into test values(zhang);
向student表中添加一些實驗數據
.Pro*C編程
Oracle的Pro*C預編譯器是一個可以讓你在C語言源程序中嵌入SQL語句的編程工具Pro*C預編譯器在預編譯過程中將嵌入的SQL語句轉換成對標准Oracle運行庫的調用從而生成預編譯過的源代碼然後再進行通常的編譯連接後就可以運行了Oracle Pro*c預編譯器使我們可以在應用程序中使用強大靈活的SQL通過這個接口我們就可以用我們的C語言程序直接訪問Oracle數據庫
用Pro*c編程分為三步
() 首先建立後綴名為pc的內嵌SQL語句的C源程序文件
$vi stupc
() 對源程序stupc進行預編譯生成單純的C源程序stuc
$proc PARSE=NONE stupc
() 編譯該C程序並加入Oracle的客戶端動態鏈接庫 生成可執行文件stu
$gcc –o stu stuc $ORACLE_HOME/lib/libclntshso
以下是stupc的源程序該程序的功能是根據用戶輸入的ID號查詢student表中學生的姓名和成績
#include <stdioh>
EXEC SQL INCLUDE SQLCA;
void main()
{
/*聲明宿主變量*/
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR usr[]pass[]serv[];
char name[];
int idscore;
EXEC SQL END DECLARE SECTION;
/*設置連接數據庫的用戶名密碼和數據庫服務名*/
strcpy(usrarrtest);
usrlen=(unsigned short)strlen((char *)usrarr);
strcpy(passarrtest);
passlen=(unsigned short)strlen((char *)passarr);
strcpy(servarrMyDB);
servlen=(unsigned short)strlen((char *)servarr);
/*以test用戶連接數據庫*/
EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
printf(Connect!\n);
/*用戶輸入欲查詢的ID號*/
printf(請輸入學生代碼:);
scanf(%d&id);
/*執行動態的SQL查詢語句*/
EXEC SQL SELECT idnamescore into :id
:name:score from student where id=:id;
printf(Name=%s Score=%d\nnamescore);
/*提交事務並斷開與數據庫的連接*/
EXEC SQL COMMIT WORK RELEASE;
printf(Disconnect!\n);
}
在Pro*C中遍歷數據表中每一條記錄的方法是通過聲明游標來實現的下面的例程stupc便是一個使用游標的例子其功能是顯示student表中的每一條記錄
#include <stdioh>
EXEC SQL INCLUDE SQLCA;
void main()
{
/*聲明宿主變量*/
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR usr[]pass[]serv[];
char name[];
int idscore;
EXEC SQL END DECLARE SECTION;
/*設置連接數據庫的用戶名密碼和數據庫服務名*/
strcpy(usrarrtest);
usrlen=(unsigned short)strlen((char *)usrarr);
strcpy(passarrtest);
passlen=(unsigned short)strlen((char *)passarr);
strcpy(servarrMyDB);
servlen=(unsigned short)strlen((char *)servarr);
/*以test用戶連接數據庫*/
EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
printf(Connect!\n);
/*聲明游標*/
EXEC SQL DECLARE stu_cursor CURSOR FOR
SELECT idnamescore 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()
{
EXEC SQL FETCH stu_cursor INTO :id:name:score;
printf(Id=%d Name=%s Score=%d\nidnamescore);
}
/*關閉游標*/
EXEC SQL CLOSE stu_cursor;
/*提交事務並斷開與數據庫的連接*/
EXEC SQL COMMIT WORK RELEASE;
printf(Disconnect!\n);
}
. JDBC編程
在Linux下用JDBC訪問Oracle數據庫主要有以下幾個技術要點
() 注冊Oracle的JDBC驅動有兩種方式一種是調用classforName方法
ClassforName(oraclejdbcdriverOracleDriver);
另一種是調用DriverManager類的registerDriver方法
DriverManagerregisterDriver(new oraclejdbcdriverOracleDriver());
() 獲取Oracle數據庫的連接也有兩種方式一是調用OCI驅動程序OCI驅動程序利用Java本地化接口(JNI)通過Oracle客戶端軟件與數據庫進行通訊
Connection conn=DriverManager
getConnection(jdbc:oracle:oci:@testtest);
另一種方式是調用Thin驅動程序Thin驅動程序是純Java驅動程序它直接與數據庫進行通訊
conn=DriverManagergetConnection
(jdbc:oracle:thin:@::MyDBtesttest);
為了獲得最高的性能Oracle公司建議在客戶端軟件的開發中使用OCI驅動程序
() 建立Statament和結果集對象執行SQL語句結果返回到結果集
Statement pstmt=conncreateStatement();
ResultSet rset= pstmtexecuteQuery(query)
() 處理結果集顯示數據
以下是遍歷student數據表的Java源程序Stujava源程序中包含了兩種注冊Oracle驅動的方式以及OCI和Thin兩種連接數據庫的方法(因程序中不可能同時使用兩種方法所以另一種方法被注釋)
/* 導入Java類 */
import javasql*;
/* 主類 */
public class Stu
{
public static void main(String argv[]) throws SQLException
{
/* 聲明並初始化變量 */
String query = new String(SELECT idnamescore FROM student);
String name;
int idscore;
Connection conn=null;
try{
/*第一種注冊JDBC的Oracle驅動的方法*/
//ClassforName(oraclejdbcdriverOracleDriver);
/*第二種注冊JDBC的Oracle驅動的方法*/
DriverManagerregisterDriver
(new oraclejdbcdriverOracleDriver());
}catch(Exception e){
Systemoutprintln(Could not load drive:+e);
Systemexit();
}
/*利用Thin驅動程序獲取Oracle連接*/
//conn=DriverManagergetConnection
(jdbc:oracle:thin:@::MyDBtesttest);
//Systemoutprintln(Connected with THIN CLIENT!);
/*利用OCI驅動程序獲取Oracle連接*/
conn=DriverManagergetConnection
(jdbc:oracle:oci:@testtest);
Systemoutprintln(Connected with OCI!\n);
/* 使用try catch抓取並處理例外 */
try {
Statement pstmt=conncreateStatement();
/* 執行SQL語句 */
ResultSet rset= pstmtexecuteQuery(query);
/* 循環處理JDBC結果集的數據 */
while(rsetnext()) {
id=rsetgetInt();
name = rsetgetString();
score=rsetgetInt();
Systemoutprintln(ID= + id);
Systemoutprintln(NAME= + name);
Systemoutprintln(SCORE= + score);
Systemoutprintln();
}
/* 關閉JDBC結果集 */
rsetclose();
/* 關閉動態SQL語句 */
pstmtclose();
}
catch(SQLException e) {
Systemoutprintln(出現SQL例外 + egetMessage());
}
connclose();
}
}
編譯執行上述源程序可顯示出student表中所有記錄
$javac Stujava
$java Stu
5. 結束語
從Oracle公司的產品策略和發展趨勢來看Java將成為Oracle數據庫最有力的工具Oracle公司在Oracle i中引入JVM並在Oracle i中已經發展得極為成熟這使得我們不僅可以利用JDBC和SQLJ訪問Oracle數據庫也可以在Oracle的PL/SQL中執行用Java編寫的存儲過程和函數兩者的結合是雙向和無縫的Java使Oracle正在成為一個平台無關的數據庫正如Oracle公司的發展目標所說的那樣沒有操作系統只有Oracle和Internet
From:http://tw.wingwit.com/Article/program/MySQL/201311/29519.html