簡介
嵌入式SQL(英文: Embedded SQL)是一種將SQL語句直接寫入C語言,COBOL,F(xiàn)ORTRAN, Ada等編程語言的源代碼中的方法。借此方法,可使得應(yīng)用程序擁有了訪問數(shù)據(jù)以及處理數(shù)據(jù)的能力。在這一方法中,將SQL文嵌入的目標(biāo)源碼的語言稱為宿主語言。
在SQL標(biāo)準(zhǔn)的SQL86(1986年發(fā)布)中定義了對于COBOL, FORTRAN, PI/L等語言的嵌入式SQL的規(guī)范。在SQL89(1989年發(fā)布)規(guī)范中,定義了對于C語言的嵌入式SQL的規(guī)范。一些大型的數(shù)據(jù)庫廠商發(fā)布的數(shù)據(jù)庫產(chǎn)品中,都提供了對于嵌入式SQL的支持。比如Oracle, DB2等1。
工作原理提供對于嵌入式SQL的支持,需要數(shù)據(jù)庫廠商除了提供DBMS之外,還必須提供一些工具。為了實(shí)現(xiàn)對于嵌入式SQL的支持,技術(shù)上必須解決以下4個問題:
1.宿主語言的編譯器不可能識別和接受SQL文,需要解決如何將SQL的宿主語言源代碼編譯成可執(zhí)行碼;
2.宿主語言的應(yīng)用程序如何與DBMS之間傳遞數(shù)據(jù)和消息;
3.如何把對數(shù)據(jù)的查詢結(jié)果逐次賦值給宿主語言程序中的變量以供其處理;
4.數(shù)據(jù)庫的數(shù)據(jù)類型與宿主語言的數(shù)據(jù)類型有時不完全對應(yīng)或等價,如何解決必要的數(shù)據(jù)類型轉(zhuǎn)換問題。
嵌入式SQL源碼的處理流程 為了解決上述這些問題,數(shù)據(jù)庫廠商需要提供一個嵌入式SQL的預(yù)編譯器,把包含有嵌入式SQL文的宿主語言源碼轉(zhuǎn)換成純宿主語言的代碼。這樣一來,源碼即可使用宿主語言對應(yīng)的編譯器進(jìn)行編譯。通常情況下,經(jīng)過嵌入式SQL的預(yù)編譯之后,原有的嵌入式SQL會被轉(zhuǎn)換成一系列函數(shù)調(diào)用。因此,數(shù)據(jù)庫廠商還需要提供一系列函數(shù)庫,以確保鏈接器能夠把代碼中的函數(shù)調(diào)用與對應(yīng)的實(shí)現(xiàn)鏈接起來2。
擴(kuò)展語法嵌入式SQL中除了可以執(zhí)行標(biāo)準(zhǔn)SQL文之外,為了對應(yīng)嵌入的需要,還增加了一些額外的語法成分。主要包含以下內(nèi)容:
宿主變量使用聲明的語法
數(shù)據(jù)庫訪問的語法
事務(wù)控制的語法
游標(biāo)操作的語法
數(shù)據(jù)庫產(chǎn)品支持嵌入式SQL的數(shù)據(jù)庫產(chǎn)品以下列出支持嵌入式SQL的數(shù)據(jù)庫產(chǎn)品以及各自支持的宿主語言O(shè)racle DatabaseAda Pro*Ada在Oracle 7.3的版本中被加入產(chǎn)品族,并且在Oracle 8中被替換為SQL*Module。但在此之后就一直沒有更新。SQL*Module支持Ada 83.C/C++ Pro*C 在Oracle 8 時被替換成了Pro*C/C++。之后Pro*C/C++ 到Oracle Database 11g仍都在被支持。COBOL Pro*COBOL到Oracle Database 11g仍都在被支持。Fortran Pro*FORTRAN 在Oracle 8之后的Oracle版本中就不再被更新,但Bug修正仍在維護(hù)中。Pascal Pro*Pascal在Oracle 8之后的Oracle版本中就不再被更新[3]。PI/L Pro*PL/I 自O(shè)racle 8之后就不再被更新,但文檔中仍然有記述。IBM DB2IBM DB2的版本9中提供了對于C/C++,COBOL,Java等宿主語言的嵌入式SQL的支持。
PostgreSQLC/C++ PostgreSQL 自版本6.3起就提供了對于C/C++的嵌入式SQL的支持,以ECPG組件的形式存在3。
嵌入形式對宿主型數(shù)據(jù)庫語言SQL,DBMS可以采用兩種方法處理,一種是預(yù)編譯,另一種是修改和擴(kuò)充主語言使之能處理SQL語句。目前采用較多的是預(yù)編譯的方法。即有DBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識別出SQL語句,把它們轉(zhuǎn)換成主語言調(diào)用語句,以使主語言編譯程序能識別它,最后由主語言的編譯程序?qū)⒄麄€源程序編譯成目標(biāo)碼。
在嵌入式SQL中,為了能夠區(qū)分SQL語句與主語言語句,所以SQL語句都必須加前綴EXEC SQL。SQL語句的結(jié)束標(biāo)準(zhǔn)則隨主語言的不同而不同。
例如:在PL/1和C中以分號(;)結(jié)束:
EXEC SQL;
在COBOL中以END-EXEC結(jié)束:
EXEC SQL END-EXEC
例如一條交互形式的SQL語句:
DROP TABLE Student;
嵌入到C程序中應(yīng)寫作:EXEC SQL DROP TABLE Student;