編程簡介
在一個嵌入式SQL程式中,SQL語句可以像其宿主語言中的程式構造一樣得到支持。當然,C和C++也可以通過宿主語言函式調用,即通過開放資料庫連線接口(ODBC)調用SQL語句。與此相似,Java程式可以通過Java資料庫連線(JDBC)方法調用來調用SQL語句。但是,我們會看到,這一類的函式調用接口較之嵌入式SQL接口是一個水平相當低的程式接口。因為這時的SQL語句是作為字元串參數傳送給函式而不是直接在宿主語言中嵌入代碼的。
詳細簡介
Oracle8i是Oracle關係型資料庫管理系統(OracleRDBMS)的最新版本,在此版本中,特彆強調了Java程式語言和Internet/Intranet資料庫應用程式的開發。Oracle8i的重要的特性之一就是全面和高效地支持SQLJ。與Oracle8一樣,Oracle8i不僅提供對關係型資料庫處理的強有力的支持,同時還支持一些對象-關係型結構,如集合類型、用戶定義類型和對象類型。
SQLJ由一系列定義了SQL與Java之間相互作用的子句和程式擴充組成。SQLJ是在Java程式語言中靜態嵌入式SQL,換句話說,一個SQLJ程式是一個包含靜態嵌入式SQL語句的Java程式。請注意,在靜態嵌入式SQL中,所有嵌入到程式中的SQL語句在編譯時都是已知的。而在動態嵌入式SQL中,至少有一些SQL語句是等到運行時才被確定的。SQLJ通過這種靜態嵌入式SQL模型完善了JDBC動態嵌入式SQL模型,這是因為JDBC只提供給Java一個動態嵌入式SQL接口,而SQLJ提供了一個靜態嵌入式SQL接口。從此,通過使用SQLJ,Java程式設計師們在Java和SQL之間有了兩種不同的程式接口:JDBC和SQLJ。其他程式語言,諸如C、C++、FORTRAN、COBOL和Ada基本上使用同一種嵌入式SQL,而SQLJ作為一個與ANSI標準多少有些不同的嵌入式SQL一直為Java所專用。這就引出了一個問題:為什麼唯獨Java有其自己的嵌入式SQL,而其他的程式語言共用一個嵌入式SQL?原因之一是SQLJ與Java的緊密耦合,特別是Java類可在SQL表中作為欄位類型使用。還有,SQLJ提供了游標結構的一種強類型版本,又稱為疊代器,這種疊代器結構巧妙地集成到Java語言中,每一個疊代器是一個Java類。同時要注意的是,與SQLJ不同,其他程式語言的嵌入式SQL同時包括靜態和動態SQL構造。
SQLJ作為一個新的標準的出現是多個廠商共同努力以求在Java程式中提供對靜態嵌入式SQL支持的結果。正如我們所看到的,一個"純"SQLJ程式是靜態的,因為所有的SQL語句都必須在編譯以前確定。但是,在一個SQLJ語句之內包含JDBC調用會使該程式成為動態的,因為程式可將SQL語句組織成一個字元串,然後將該字元串傳送給JDBC方法去執行。SQLJ可用來在JServer環境下執行存儲過程、觸發器和類,也可用於Enterprise JavaBeans和CORBA.
SQLJ由一系列子句組成,這些子句擴展了Java程式。語言的標準說明是一個聯合說明,它由包括IBM、Compaq/Tandem、JavaSoft、Oracle、Sybase和Informix在內的主要資料庫工具廠商和資料庫廠商所聯合支持。SQLJ提供了在訪問資料庫的客戶端和中間件以及在利用Java的數據伺服器端開發應用程式的方法。SQLJ應用程式是可移植的,並且可以使用標準JDBC驅動程式與多廠商的資料庫進行通信。
當編寫一個SQLJ程式(原始碼)時,所編寫的是一個Java程式並按一定的語法規則嵌入式SQL語句,這套語法規則說明了怎樣將SQL語句嵌入到Java原始碼中。然後運行一個SQLJ翻譯器將SQLJ程式轉換為一個標準Java程式。一個Oracle SQLJ翻譯器在原理上與其他Oracle 嵌入式SQL預編譯器類似。SQLJ翻譯器完成下列工作:
* 對嵌入式SQL構造進行語法檢查。
* Java和SQL數據類型檢查。
* 模式檢查。
翻譯時,SQL翻譯器用SQLJ運行時庫中的調用來替代嵌入式SQLJ語句,該運行時庫真正實現SQL操作。這樣翻譯的結果是得到一個可使用任何Java翻譯器進行編譯的Java源程式。一旦Java源程式被編譯,Java執行程式就可在任何資料庫上運行。
SQLJ運行環境由純Java實現的小SQLJ運行時庫(小,意指其中包括少量的代碼)組成,該運行時庫轉而調用相應資料庫的JDBC驅動程式。
一個SQLJ程式可以在多種環境下運行。所編寫的SQLJ程式可以在客戶端進行,不管是在瘦客戶端如Web瀏覽器和網路計算機上,還是在一個工作站或PC上。由於這種位置的透明性,使得用戶可以很方便地將SQLJ程式從一個地方移植到另一個地方或從一個系統移植到另一個系統。