嵌入式SQL
嵌入式SQL
嵌入式SQL(英文 Embedded SQL)是一種將SQL語句直接寫入C語言,COBOL,FORTRAN, Ada等編程語言的源代碼中的方法。
嵌入式SQL工作原理
在SQL標準的SQL86(1986年發布)中定義了對於COBOL, FORTRAN, PI/L等語言的嵌入式SQL的規範。在SQL89(1989年發布)規範中,定義了對於C語言的嵌入式SQL的規範。一些大型的資料庫廠商發布的資料庫產品中,都提供了對於嵌入式SQL的支持。比如Oracle, DB2等。
提供對於嵌入式SQL的支持,需要資料庫廠商除了提供DBMS之外,還必須提供一些工具。為了實現對於嵌入式SQL的支持,技術上必須解決以下4個問題:
1.宿主語言的編譯器不可能識別和接受SQL文,需要解決如何將SQL的宿主語言源代碼編譯成可執行碼;
2.宿主語言的應用程序如何與DBMS之間傳遞數據和消息;
3.如何把對數據的查詢結果逐次賦值給宿主語言程序中的變數以供其處理;
4.資料庫的數據類型與宿主語言的數據類型有時不完全對應或等價,如何解決必要的數據類型轉換問題。
嵌入式SQL源碼的處理流程 為了解決上述這些問題,資料庫廠商需要提供一個嵌入式SQL的預編譯器,把包含有嵌入式SQL文的宿主語言源碼轉換成純宿主語言的代碼。這樣一來,源碼即可使用宿主語言對應的編譯器進行編譯。通常情況下,經過嵌入式SQL的預編譯之後,原有的嵌入式SQL會被轉換成一系列函數調用。因此,資料庫廠商還需要提供一系列函數庫,以確保鏈接器能夠把代碼中的函數調用與對應的實現鏈接起來。
嵌入式SQL中除了可以執行標準SQL文之外,為了對應嵌入的需要,還增加了一些額外的語法成分。主要包含以下內容:
• 宿主變數使用聲明的語法
• 資料庫訪問的語法
• 事務控制的語法
• 游標操作的語法
支持嵌入式SQL的資料庫產品以下列出支持嵌入式SQL的資料庫產品以及各自支持的宿主語言Oracle DatabaseAda Pro*Ada在Oracle 7.3的版本中被加入產品族,並且在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修正仍在維護中。Pascal Pro*Pascal在Oracle 8之後的Oracle版本中就不再被更新。PI/L Pro*PL/I 自Oracle 8之後就不再被更新,但文檔中仍然有記述。IBM DB2IBM DB2的版本9中提供了對於C/C++,COBOL,Java等宿主語言的嵌入式SQL的支持。
PostgreSQLC/C++ PostgreSQL 自版本6.3起就提供了對於C/C++的嵌入式SQL的支持,以ECPG組件的形式存在。
對宿主型資料庫語言SQL,DBMS可以採用兩種方法處理,一種是預編譯,另一種是修改和擴充主語言使之能處理SQL語句。目前採用較多的是預編譯的方法。即有DBMS的預處理程序對源程序進行掃描,識別出SQL語句,把它們轉換成主語言調用語句,以使主語言編譯程序能識別它,最後由主語言的編譯程序將整個源程序編譯成目標碼。
在嵌入式SQL中,為了能夠區分SQL語句與主語言語句,所以SQL語句都必須加前綴EXEC SQL。SQL語句的結束標準則隨主語言的不同而不同。
例如:在PL/1和C中以分號(;)結束:
EXEC SQL;
在COBOL中以END-EXEC結束:
EXEC SQL END-EXEC
例如一條交互形式的SQL語句:
DROP TABLE Student;
嵌入到C程序中應寫作:EXEC SQL DROP TABLE Student;