前言
本文將從一個數據庫程序員的角度介紹sybase公司出品的SQL Anywhere Studio(SAS) 6.0.3 for Linux的特征、強項、弱項、安裝和管理技巧,並給出一個精美的例子。如果你用C語言程序員,你可以從本文介紹的SQLC入門教材獲益匪淺。
Sybase是SQL數據庫管理系統中著名老牌產品之一。事實上,微軟的SQL Server最早是一個移植到DOS/Windows平台的Sybase產品。自從兩公司分手,Sybase一直專長於Unix系統,當數據庫和其他企業應應開發商都認為Unix行將終結而NT取得市場地位時,Sybase仍繼續在1997和1998專著於Unix,結果它本性未改並在1998年的業界移植到Linux的狂熱中,將其企業服務器的旗艦產品ASE(Adaptive Server Enterprise)移植到Linux上,過多的與RedHat、caldera和SuSE捆綁的評測軟件包以及可以證明Sybase對Linux社團的支持。
Sybase新近發布了SQL Anywhere Studio 6.0.3,它是一套捆綁ASE及其工具的集成套件。6.0.3版最終增加與RedHat 6.0兼容性。現在,RedHat 5.x和6.x是唯一支持的平台,但是Sybase稱支持Caldera、OpenLinux和SuSE等官方發行版本的工作也正在進行。
縮略詞匯表
SQL:
Structured Query Language / 結構化查詢語言
DBMS: Database
Management System / 數據庫管理系統
ASE: Adaptive
Server Enterprise / Sybase數據庫產品
SAS: SQL Anywhere
Server / Sybase數據庫集成工具
RAM: Random
Access Memory / 隨機存取記憶
bash: Bourne
Again Shell / : 一種Linux系統的Shell
ISQL: Interactive
SQL / 交互式結構化查詢語言
UI: User
Interface / 用戶接口
GNOME: GNU Object
Modeling Environment / GNU對象建模環境
JDK: Java
Development Kit / Java 開發工具包
JVM: Java Virtual
Machine / Java 虛擬機
JDBC: Java
Database Connectivity / Java 數據庫連接
URL: Universal
Resource Locator / :通用的的資源定位器
HTML: Hypertext
Markup Language / 超文本標注語言
SQLC: SQL in C /
SQL in C
PSM: Procedural Stored Model /存儲過程模型
SQLJ: SQL in Java
/ Java語言的SQL
BLOB: Binary
Large Objects / 大型二進制對象
CLOBs: Character
Large Objects / 大型字符對象
XML: Extensible
Markup Language / 可擴展的標注語言
jar: Java Archive
/ Java 歸檔文件
stdout: Standard
Output / 標准輸出設備
stderr: Standard
Error / 標准出錯設備
API: Application
Programming Interface / 應用編程接口
GTK: Gimp Toolkit
/ Gimp工具箱
KDE: K Desktop
Environment / K桌面環境
DBA: Database
administrator / 數據庫管理員
ODBC: Open
Database Connectivity / 開放數據庫連接
Tcl: Tool Command
Language / 工具命令語言
SQSH: SQL Shell /
結構化查詢語言外殼程序
PHP: PHP
Hypertext Processor / PHP 超文本處理器
TDS: Tabular Data
Stream / 表格化數據流
安裝和設置
我在兩台機器上安裝SAS 6.0.3測試網絡工作組功能。我首先在在一台96MB內存的奔騰400運行RedHat
6.0的機器上安裝SQL服務器。光盤中有一個安裝腳本啟動一個全屏幕字符菜單的安裝程序(見圖1)。我用root用戶運行該腳本。首先,我被要求選擇一個要安裝的部件(我選了Adaptive
Server Enterprise 6.0.3);接下來我選擇在部件以內被給包裹的選擇(我選擇了網絡服務器,它包含一個SQL
Remote的Personal Server,並且表明了我想要Java支持)。它給出一個正在安裝文件的提示,然後詢問我的名字、公司和許可證的類型。
圖1 SQL服務器安裝程序
然後怪事發生了,安裝腳本開始安裝Sybase Central(Java控制面板),但接下來報錯目錄$SYBASE不存在,在安裝前,我已經指定了/opt/sybase-ase6作為安裝目錄,因此我期望腳本能相應地設定$SYBASE環境變量,但它建議/opt/sybase作為默認目錄,與原來建議的默認目錄/opt/SYBSase6不同。
結果,我不能肯定安裝是否確實要求Sybase Central在另一個不同的地點。我繼續並且重新指定/opt/sybase-asa6。一切看上去正常,但是這點混亂Sybase應該能很容易地避免並糾正。
接下來返回組件菜單,從那裡我選擇結束安裝,然後在我的個人用戶帳目定義$SYBASE,並將$SYBASE/bin增加到PATH,/$SYBASE/lib增加到LD_LIBRARY_PATH中。對bash用戶,命令是:
$ export SYBASE=/opt/sybase-asa6
$ export PATH=$PATH:$SYBASE/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SYBASE/lib
然後我浏覽了quick-start/tutorial目錄下的README.1ST文件,用下面的命令啟動一個數據庫例子:
$ dbeng6 asademo.db
不要在命令行後加&以後台進程來運行服務器,相反,用選項"-gu"以守護進程方式運行。
Interactive SQL的安裝
然後我打開全屏字符模式查詢界面,在另一窗口運行dbisql命令啟動Interactive
SQL(ISQL),ISQL尋找運行的本地服務器,如果它找到,自動聯接,當然首先詢問你的用戶名和口令當然。從ISQL,我執行一個簡單的查詢:
select * from employee
查詢結果見圖2。
SQL鍵盤命令表
F1:Help
/ 幫助
F5:Scroll data
display left / 向左滾動數據顯示
F6:Scroll data
display right / 向右滾動數據顯示
F9:Execute the
SQL query you have entered / 執行你的輸入的SQL查詢
F10 :Activate the
menus / 激活菜單
Ctrl+PgUp :Move to top
of data display / 移到數據顯示的頂部
Ctrl+PgDn :Move to
bottom of data display / 移到數據顯示的底部
圖2 Select查詢的結果
注意你必須按F9鍵來執行查詢。這只是幾個老式鍵盤和圖形用戶界面的選擇之一,可惜這表明Isql有些陳舊。鼠標器在運行GNOME終端的bash控制台上不能工作。但它有時能很精確地確定你在點按的位置。
ISQL包含一個界面執行SQL查詢,並且它也能用於其他很多數據庫管理任務。但是Sybase也在新的Sybase
Central Java Edition(Java版Sybase Central)中提供了一個更人友好的數據庫管理接口。為了運行它,你必須有一個能工作的JDK,不幸的是,JDK還不是RedHat或其他Linux發行版本的核心部件。我使用Blackdown移植計劃(參見附錄)的jdk117_v3。注意Sybase
Central使用JDK 1.1版,這樣就不需要最新的Blackdown或其他JDK 1.2版。
$SYBASE/sybcentral32/java/scjview
你首先要注意的是Sybase Central顯示有些不清晰的字體(見圖 3 ),這很可能是JVM而不是應用的問題,但是如果應用允許字體的更改就更好了。 Sybase宣稱正在解決此問題。下面的屏幕快照是連接上面已經啟動的數據庫服務器例子的情形。你必須用主機名或IP地址指定服務器。端口是標准的Sybase端口(2638 ),並且數據庫名字是asademo。這確實只是連接一個JDBC查詢的前端,該JAVA查詢設置數據庫連接的URL並初始化強大的類集合以樹狀結構顯示各種數據庫組件(我們以後將看見本文中用到的一些底層JDBC)。應用使用Swing Java用戶接口類(Sybase自帶,因此沒有必要單獨下載他們),並且你能在運行時刻改變外觀。不幸地,這些顯示選項沒有改進字體的選擇。
圖3 用Sybase Central Java Edition連接樣本數據庫
在CD-ROM上軟件包有優秀文檔,它以HTML形式被組織很好並且交叉參考。Sybase確實盡力使用戶快速而容易進入軟件包,並且它在文檔方面顯示出了這種努力。
SQLC編程-將SQL嵌入C語言
大多數數據庫管理系統引擎現在都支持C和C++代碼中嵌入SQL查詢。Sybase使它更簡單。不幸的是,提供的例子不必兜圈子,也不必為各種的操作系統包含一個條件章節的大全。我開始便寫設計運行在Linux上一個更直接例子,你將在它下面找到:
如果你對SQLC還不熟悉,你要注意的第一事情是散布在代碼中以EXEC
SQL開始的非C語言語句,這些是特殊的指令,SQLC預處理器知道是靜態語句(static
statements),這個預處理器將這些語句轉換為正確的C代碼,他們引用DBMS庫函數以便在數據庫引擎上執行命令。因為他們是硬編碼(hard-coding)到結果目表代碼,因此他們是靜態語句。
SQLC功能強大的部分是特殊聲明的C變量,它能直接被嵌入到SQL語句以接受結果,或把變量傳遞給運行時刻(runtime)詢問。這樣的變量被看作主機變量(host
variables),在上面例子中在fetch_rows函數重使用主機變量將查詢結果從查詢傳遞給標准C變量。
EXEC SQL FETCH RELATIVE 1 C1
INTO
:emp_id, :name, :sex, :birthdate;
emp_id、name、sex和birthdate是基本C指針,包含查詢返回值。這種情況下,查詢准備從以前用下列語句設置的光標中獲取下一行值。
EXEC SQL DECLARE C1 CURSOR FOR
SELECT emp_id, emp_fname || ' ' ||
emp_lname, sex, birth_date
FROM "dba".employee;
表達式emp_fname || ' ' || emp_lname連接兩個字符類型的列emp_fname和emp_lname,變成一個字符串值,從查詢返回值。
為了使這個例子工作,拷貝例子源碼到一個文件listing1.sqc中,並且運行SQLC預處理器:
$ sqlpp listing1.sqc
為了使這個例子工作,拷貝例子源碼到一個文件listing1.sqc中,並且運行SQLC預處理器:
$ sqlpp listing1.sqc
它輸出一個C文件listing1.sqc,你必須編譯它,特別小心地指定相關的庫和包括文件目錄:
$ cc -Wall -I$SYBASE/include/ -L$SYBASE/lib/ -ldblib6 -ldbtools6 -o listing1 listing1.c
產生一個可執行文件listing1。在運行它之前,保證有一台引擎運行范例數據庫:
$ dbeng6 asademo.db
它的輸出應該是這樣的:
Java內幕
我在另一篇關於Oracle 8.0.5介紹中討論過JDBC,在Sybase中使用JDBC十分類似(當然這是JDBC的主要目標之一)。然而,主要的數據庫管理系統供應商在一個更專利的基礎上一直在競爭的一個領域Java存儲過程(JAVA
stored procedure)。例如 PL/SQL 過程我在Oracle的文章有所論述,它允許用戶創造能存儲在數據庫中的特定例程,與數據協作,這在客戶端查詢中允許更加成熟和定制特性。
Sybase支持傳統的存儲過程、程序存儲模型和Transact-SQL方法,但是它也允許存儲過程甚至使用JAVA重寫的擴展類型。注意,Sybase確實至今還不允許對應於JAVA的SQLJ(SQLC對應C/C+)。Sybase的Java存儲過程使用JDBC,並且是不比客戶端的Java開發困難。
Sybase的Java存儲過程仍不支持一些有用的JDBC數據類型,包括大二進制對象(BLOB)、大字符對象(CLOB
)和數組。有希望的是,Sybase將不久支持這些,特別是CLOB對集中XML文件存儲是非常有用的。
為了對Java存儲過程有個印象,我寫了下列代碼:
增加一個存儲過程或函數看起來很簡單。你寫出類並且導入(import)適當的包(package),然後簡單地編寫過程或函數,把這些過程或函數作為公共類的靜態方法存儲器來(對數據庫存取使用JDBC)。在我們的例子中,我們定義函數GetContactBuddy,它取一個整數並且返回一個整數。
我使用了Sybase自帶樣品數據庫,它包含雇員、部門和合同的表(table)。我小小的演示函數的想法是我們決定了在我們的公司實現一個伙伴系統,所有的合同都有一個基於地理位置雇員伙伴。基本上,我們用與郵政編碼相同的合同號挑選雇員。Java函數幫助我們選擇。如果你傳來一個合同號,它將返回一個位於相同郵政編碼的一個雇員標識符(如果有),當然如果沒有,我就能用一個連接(join)從單獨的查詢得到結果:
select e.emp_id from employee e, contact c where e.zip_code = c.zip
但是那將是更加沒趣。
為了使用該函數,我們必須首先編譯它,將上面代碼拷貝到listing3.java,並且運行命令:
$ javac listing3.java
另外,你需要JDK 1.1.x並在CLASSPATH中包括$SYBASE/java/asajdbc.zip。當然,上述命令生成listing3.class。
現在,我們在樣品數據庫中登記它。通過Sybase Central我們很容易做到,在樹狀圖中沿著asademo/Java
Objects路徑,點擊Add Java Class或Jar圖標。Java Wizard(Java向導)將詢問你是否登記一個類或一個Java歸檔(jar),然後你指定類文件的路徑,全部搞定。
你能通過標准SQL語句調用函數,運行ISQL並且進入命令窗口:
select listing3>>GetContactBuddy('7')
它被當作常規的SQL選擇,從函數返回整數值。如果你正在使用樣品數據庫,回答應該是409。如果我們的類定義成一個過程(一個沒有返回方法)。我們能這樣調用它:
call java_class>>method_name(arguments)
你可能注意了Java代碼中的打印語句,例如:
System.out.println(zip);
並且你可能一直想知道他們的輸出在哪兒出現。存儲過程將數據庫引擎的stdout和stderr作為控制台,因此如果你到正在運行dbeng6的終端,你將看見輸出。如果有任何異常,你也將看見棧跟蹤。
所有這些似乎足夠直觀,但是我在簡單的存儲過程編程中的掩蓋了巨大的煩惱,他們大多數確實應該提一提。
所有這些似乎足夠直觀,但是我在簡單的存儲過程編程中的掩蓋了巨大的煩惱,他們大多數確實應該提一提。
不足
首先,Sybase Central慢地驚人。我猜想這是使用遠程數據庫API和Java造成的不可避免的後果之一,但是不提太痛苦了。也許Sybase能通過開發一個GTK、KDE或WxWindows版本的界面,才能更好地向Linux愛好者展示。
另一個問題是我只能通過在Sybase Central樹狀途中的asademo/Java
Objects/Packages路徑定位我登記的類,問題是幾乎所有sun(故意用雙關語)下面的Java類也出現在該表中,它與極慢的滾動一起,使得尋找一個特定類的要求變得難上加難。而且,自從你通過類圖標的屬性菜單將任何改動再裝入到你的過程後,當開發並調試你的代碼時,你可能必須多次進行這種搜索。僥幸的是,存儲過程使用JDBC,因此圍繞此問題還有一個好方法:給你的類增加main以允許他們成為遠程應用的實用手段。這允許你在不得不在數據庫登記他們而遇到麻煩前,用一個簡單的編譯/執行周期即可捕捉許多臭蟲,但是這個解決辦法有點奇特,考慮產品是一個數據庫管理系統,並且DBMS應當幫助管理你的數據。Sybase並沒有說它為解決提到的大量問題而正在研制過濾器。
至於ISQL,我發現,如果我改變了服務器端的代碼,ISQL直到我重新連接到數據庫才識別出變化。這實際上式一件好事-它保證正在運行的應用將不會突然發現他們的服務器端組件自行改動。但是它沒被文檔記錄,並且我浪費了一些時間嘗試弄明白為什麼我的改變沒被客戶登記。我也發現了如果你在一個過程或函數使用錯誤的參數類型或數量,服務器將返回一個“過程沒找到”的錯誤。我想這是因為他們使用一個亂名(name-mangling)技術以允許過程名字的多態性。但是這在數據庫存儲過程的上下文有些混亂。再者,後端好像不提供標准Java包裝(wrapper)類作為參數的變換器(像Integer和Double那樣),用如Integer或Double那樣的原語,否則你將遇到“過程沒找到”的錯誤。
但是一旦你熟悉它,使用Sybase SAS的Java存儲過程是很容易的,要考慮到它是一種高級特性。
管理
Sybase提供很多基本的數據庫管理工具用於安全性、網絡連接、數據庫復制、存儲過程管理等。Sybase
Central以樹狀結構提供存儲過程和用戶資料等的數據庫信息。Sybase將它的復制代理移植到Linux,它允許DBA把數據庫以高度定制的方法復制。然而,Sybase公司還沒移植它的復制服務器到Linux平台(盡管它說工作正在進行)。如果你想為你的數據庫提供ASE的全部動力,只有到這樣的移植成形,否則你無法運行單獨在一個不同的平台上運行ASE復制服務器(例如Solaris)。然後你能在Linux系統上運行實際的數據庫,使用復制代理的Linux版本。注意那種低頻、簡單的復制也用SQL
Remote管理而不必干擾一個單獨數據庫。
Sybase已經努力減少調節和管理企業級數據庫管理系統的大部分復雜性。有一個內置的查詢優化程序能從早先的詢問學習以變得更聰明,動態優化而非要求很多秘傳的數據庫管理員的絕技,因為DBMS是公開的。最終目標是允許非數據庫管理能有效地運用數據庫。Sybase完成一部分這個值得稱道的目標,甚至從版本6.0.3開始消除一些缺陷,例如,為一個使用-c選項啟動的SQL服務器實例(instancs)調節緩存大小,過去一直很重要(一般到期望的數據庫最大尺寸的大約20%)。也有必要使用-p選項增加網絡包尺寸,現在這樣的參數設置有更加智能化的默認值。
結論與一些工具
有很多Sybase第三方Linux程序。如果你希望使用ODBC,Openlink的ODBC驅動程序是一個好選擇。Pathon用戶可以結合像Marc-Andre
Lemburg的mxODBC模塊來訪問Sybase,因為Python沒有直接的捆綁。Tcl用戶有點幸運:他們有Tom
Poindexter的Sybtcl,它是Tcl的一個原生Sybase庫。Scott Gray編寫了SQSH,它是一個很受歡迎的ISQL替換品,它設計成仿真典型的Unix外殼。Martin
Mevald用PHP編寫了一個簡單的基於Web的查詢接口。Walter Rawdanik最近提出了SybSQL,一個用Qt工具包編寫的SQL編輯器,它用TDS協議連接Sybase
ASE或Microsoft SQL Server。最後,有一個免費軟件方案-FreeTDS,它創建一個庫在報文級表格式數據流來訪問Sybase。當Sybase沒有一個Linux客戶時,這顯得更加關鍵,但是為了Sybase數據庫寫操作更有效,底層的工具仍然是好方法。微軟的SQL
Server,它從Sybase繼承了TDS,所以也能使用 FreeTDS被訪問,請參見附錄資源連接。
有一件事情是相當清楚:Sybase for Linux必Oracle 8.0.5 for Linux或DB2 6.0
for Linux更容易安裝、設置和管理。一般地講,可親近性(accessibility)使得Sybase更引起人們的注意,我向沒有安裝和維護方面頂尖數據庫管理員經驗的部門和組織推薦Sybase。Sybase服務器的Central確實仍然在可用性的方面需要一些工作。一個好即時Java編譯器(just-in-time
Jave compiler)也許能幫助改進其性能;但是 Sybase應該理會像在視圖終提供過過濾器這樣的細節。Sybase的可親近性擴大到了它的編程接口,但是JDBC驅動程序中缺乏對CLOB、BLOB和數組的支持使人們懷疑Java組件的成熟程度,目前缺乏SQLJ也是如此。這不應該有什麼擔心,除了最高級Java數據庫程序員,但是那些在痛苦邊緣人們可能會考慮Oracle或
Db2跟多的Java特性。總之, Sybase的加入廣受Linux世界的歡迎,它為可能不能幸運地雇用到企業數據庫管理員的人提供企業數據庫管理系統。
附錄:參考文獻
Sybase:
http://sybase.com/
Sybase SQLAnywhere:
http://sybase.com/products/anywhere/index.html
"Oracle on Linux," Uche Ogbuji (LinuxWorld, May 1999):
http://www.linuxworld.com/linuxworld/lw-1999-05/lw-05-oracle.html
The public Sybase NNTP server, with the forums sybase.public.sqlanywhere.linux
and sybase.public.sqlserver.linux:
news://forums.sybase.com
The Blackdown JDK port:
http://www.blackdown.org
Linux ODBC drivers and connectivity software:
http://www.openlinksw.com/
Web-based query interface:
http://www.penguin.cz/~martinmv/websql/
Library for Sybase's wire-level protocol:
http://www.freetds.org/
Python ODBC library:
http://starship.skyport.net/~lemburg/mxODBC.html
Linux ISQL replacement:
http://www.voicenet.com/~gray/sqsh.html
Tcl Interface to Sybase:
http://www.nyx.net/~tpoindex/tcl.html#Sybtcl
Qt Sybase SQL Editor:
http://www.megsinet.net/~agatka/
——摘自:Linuxworld