陸廷榮
摘要:為解決目前高校數(shù)據(jù)庫課程講授嵌入式SQL面臨的問題,本文闡述了用開源數(shù)據(jù)庫PostgreSQL講授嵌入式SQL的過程。用開源數(shù)據(jù)庫PostgreSQL講授嵌入式SQL,既充分說明了嵌入式SQL的概念、工作原理、執(zhí)行過程,還介紹了開源軟件的概念,展示了開源軟件用于教學(xué)的一個良好范例。
關(guān)鍵詞:嵌入式SQL;PostgreSQL;數(shù)據(jù)庫課程;開源軟件
中圖分類號:G642.3文獻(xiàn)標(biāo)識碼:A文章編號:1002-4107(2012)02-0042-02
一、引言
SQL(Structured Query Language)語言是標(biāo)準(zhǔn)化的數(shù)據(jù)庫操作語言[1]。嵌入式SQL是ODBC(Open Data Base Connectivity)、JDBC(Java Data Base Connectivity)等數(shù)據(jù)庫訪問接口標(biāo)準(zhǔn)出現(xiàn)之前的編程語言訪問數(shù)據(jù)庫的編碼規(guī)范[2],是指將SQL語句嵌入到宿主語言(Host language)中,比如,嵌入到C/C++、Java等編程語言中,既利用SQL語言的數(shù)據(jù)庫操作能力,又克服SQL語言無流程控制語句無法實現(xiàn)復(fù)雜邏輯的限制。嵌入式SQL是數(shù)據(jù)庫課程中的重要內(nèi)容[3]。
目前高校數(shù)據(jù)庫課程的上機(jī)實驗環(huán)境多數(shù)是MS Windows平臺上的MS SQL Server 2005(Express)。MS
SQL Server 2005(Express)已不再支持嵌入式SQL。MS Windows平臺上的其他主流數(shù)據(jù)庫管理系統(tǒng)如Oracle、DB2、MS SQL Server 2000等支持嵌入式SQL,但Oracle、DB2、MS SQL Server 2000等都是有版權(quán)保護(hù)的商品數(shù)據(jù)庫管理系統(tǒng),使用存在限制,并且MS SQL Server 2000已是十年前的過時產(chǎn)品,實際生產(chǎn)系統(tǒng)已很少應(yīng)用。因此,我們把講授嵌入式SQL的上機(jī)實驗環(huán)境轉(zhuǎn)向可自由使用的開源數(shù)據(jù)庫。
目前主流開源數(shù)據(jù)庫管理系統(tǒng)有MySQL[4]、PostgreSQL[5]、Ingres[6]、Firebird[7]、SQLite[8]等。MySQL是使用最廣泛的開源數(shù)據(jù)庫管理系統(tǒng),但目前版本不支持嵌入式SQL。Firebird是輕型數(shù)據(jù)庫管理系統(tǒng),是否支持嵌入式SQL缺乏文獻(xiàn)支持。SQLite是嵌入式數(shù)據(jù)庫管理系統(tǒng),同樣不支持嵌入式SQL。具有同一歷史淵源的PostgreSQL、Ingres支持嵌入式SQL,根據(jù)數(shù)據(jù)庫支持工具的豐富程度、文獻(xiàn)豐富程度、開源項目的活躍程度,最后作者選擇PostgreSQL作為講授嵌入式SQL的上機(jī)實驗環(huán)境。
下面介紹用開源數(shù)據(jù)庫PostgreSQL講授嵌入式SQL處理的關(guān)鍵過程。
二、嵌入式SQL的處理過程
嵌入式SQL的處理過程一般如下所述。首先,使用具體DBMS的依賴具體宿主語言的預(yù)處理器將嵌入式SQL的宿主語言源程序轉(zhuǎn)換成合法宿主語言源程序,相應(yīng)的嵌入式SQL語句轉(zhuǎn)換成宿主語言函數(shù)調(diào)用。再使用宿主語言編譯器將預(yù)處理過的嵌入式SQL的宿主語言源程序編譯成目標(biāo)代碼。最后使用宿主語言鏈接器將目標(biāo)代碼與具體DBMS的函數(shù)庫鏈接生成能訪問數(shù)據(jù)庫的可執(zhí)行代碼。嵌入式SQL的處理過程如圖1所示。
三、嵌入式SQL在PostgreSQL數(shù)據(jù)庫中的
處理過程
本文中操作系統(tǒng)平臺是MS Windows;DBMS使用PostgreSQL 9.0;C編譯器使用開源軟件MinGW[9] C編譯
器gcc;C鏈接器使用MinGW C鏈接器ld。
預(yù)處理器使用pgtypes library將嵌入式SQL的數(shù)據(jù)類型映射成C語言數(shù)據(jù)類型。
嵌入式SQL預(yù)處理器將嵌入式SQL C源程序中的嵌入式SQL語句轉(zhuǎn)換成函數(shù)調(diào)用,使其成為一個純粹的C源程序。純粹的C源程序用C編譯器編譯成目標(biāo)代碼。目標(biāo)代碼的鏈接階段要包含實現(xiàn)嵌入式SQL語句轉(zhuǎn)換成的函數(shù)調(diào)用的函數(shù)庫。
PostgreSQL數(shù)據(jù)庫中嵌入式SQL C源程序文件的擴(kuò)展名通常為“.pgc”,比如,esql.pgc。
(一)嵌入式SQL預(yù)處理階段
PostgreSQL數(shù)據(jù)庫的嵌入式SQL預(yù)處理器是ecpg,預(yù)處理階段的命令行命令是,ecpg esql.pgc。
在正確預(yù)處理后將生成宿主語言源程序——同名的C源程序,esql.c。
(二)宿主語言編譯階段
使用MinGW C編譯器gcc,gcc -I“D:MinGWincl-
ude” -I“C:Program FilesstgreSQL9.0include” -c esql.c。
其中“-I”開關(guān)用于指示編譯過程所需庫文件的查找路徑?!?c”開關(guān)用于指示只編譯成目標(biāo)代碼而不自動執(zhí)行鏈接過程生成可執(zhí)行文件。
在正確編譯后將生成同名的目標(biāo)代碼文件,esql.o。
(三)目標(biāo)代碼鏈接階段
使用MinGW C鏈接器ld,ld -o esql.exe esql.o -L “C:Program FilesPostgreSQL9.0lib”lecpg。
其中“-o”開關(guān)用于指示生成可執(zhí)行文件名,否則默認(rèn)將生成UNIX/Linux規(guī)范的可執(zhí)行文件名?!?L”開關(guān)用于指示編譯過程所需庫文件的查找路徑?!?l”開關(guān)用于指示鏈接的庫文件。
在正確編譯后將生成同名的可執(zhí)行代碼文件,esql.exe。
本文分析了目前高校數(shù)據(jù)庫課講授嵌入式SQL面臨的問題,討論了用開源數(shù)據(jù)庫PostgreSQL講授嵌入式SQL的過程。用開源數(shù)據(jù)庫PostgreSQL講授嵌入式SQL,既充分說明了嵌入式SQL的概念、工作原理、執(zhí)行過程,還同時介紹了開源軟件的基本概念,展示了開源軟件用于教學(xué)的一個良好范例。
參考文獻(xiàn):
[1]SO/IEC 9075-1:2008 Information technology—Dat-
abase languages—SQL—Part 1:Framework(SQL/Fra-
mework)[EB/OL].http://www.iso.org/iso/catalogue_
detail.htm?csnumber=45498,2011.
[2]ISO/IEC 9075-3:2008 Information technology—
Database languages—SQL—Part 3:Call-Level Int-
erface(SQL/CLI)[EB/OL].http://www.iso.org/iso/
iso_catalogue/catalogue_tc/catalogue_detail.htm?
csnumber=38641,2011.
[3]王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論(第四版)[M].高等教育
出版社,2006.
[4]MySQL[EB/OL].http://www.mysql.com/,2011.
[5]PostgreSQL[EB/OL].http://postgresql.org/,2011.
[6]Ingres[EB/OL].http://www.ingres.com/,2011.
[7]Firebird[EB/OL].http://www.firebirdsql.org/,2011.
[8]SQLite[EB/OL].http://www.sqlite.org/,2011.
[9]MinGW|Minimalist GNU for Windows[EB/OL].http:
//www.mingw.org/,2011.