一文詳解嵌入式SQL
目錄
- 嵌入式SQL概述
- 使用嵌入式SQL的注意事項
- 區分SQL語句與主語言語句
- 數據庫工作單元和程序工作單元之間的通信
- 協調兩種不同的處理方式
- 嵌入式SQL程序的組成
- 程序首都
- 程序體
- 在嵌入式SQL中使用游標檢索多個元組
- 游標定義語句
- 游標打開語句
- 游標推進語句
- 游標關閉語句
- 嵌入式SQL程序實例
嵌入式SQL概述
嵌入式SQL(Embedded SQL) 是應用系統使用編程方式來訪問和管理數據庫中數據的主要方式之一。
SQL語言有兩種使用方式:一種是作為獨立語言,以交互式方式使用,在這種方式下使用的SQL語言是面向集合的描述性語言,是非過程化的。即大多數語句都是獨立執行,與上下文無關的。另一種是嵌入到某種高級語言中使用,利用高級語言的過程化結構來彌補SQL語言在實現諸如流程控制等復雜應用方面的不足。這種方式下使用的SQL語言稱為嵌入式SQL( Embedded SQL),能嵌入SQL的高級語言稱為主語言(Host Language)或宿主語言。目前SQL標準中指定的宿主語言主要有C、C++、COBOL、Pascal、Java、PL/I和FORTRAN等。
對于嵌入式SQL, DBMS一般采用預編譯的方法,即由DBMS的預處理程序對源程序進行掃描識別出SQL語句,并把它們轉換成主語言中相應的調用語句,成為主語言源程序,以使主語言編譯程序能夠識別它們,最后由主語言的編譯程序將它編譯成目標代碼,如下圖所示。
使用嵌入式SQL的注意事項
把SQL嵌入主語言使用時必須要解決下面幾個問題:
區分SQL語句與主語言語句
主要通過在所有的SQL語句前加前綴EXEC SQL來解決。SQL語句一般以分號(;) 作為結束的標志
EXEC SQL <SQL語句>;
數據庫工作單元和程序工作單元之間的通信
嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數據。把SQL語句中使用的主語言程序變量簡稱為主變量或共享變量。
主變量根據其作用的不同,分為輸入主變量和輸出主變量。輸入主變量由應用程序對其賦值,SQL語句引用;輸出主變量由SQL語句對其賦值或設置狀態信息,返回給應用程序。一個主變量有可能既是輸入主變量又是輸出主變量。在SQL語句中使用主變量時,需在主變量名前加冒號(:)作為標志,以區別于數據庫對象的表名或屬性名(字段名)。
SQL語句執行后,系統要反饋給應用程序若干信息,這些信息被送到稱為SQL的通信區的SQLCA中。SQLCA用語句EXEC SQL INCLUDE加以定義。SQLCA 是一個數據結構,SQLCA中有一個存放每次執行SQL語句后返回代碼的狀態指示變量SQLCODE。當SQLCODE為零時,表示SQL語句執行成功,否則返回一個錯誤代碼(負值)或警告信息(正值)。
協調兩種不同的處理方式
一般情況下,一個SQL查詢一次可以檢索多個元組(面向集合),而主語言程序通常是"一次一個元組"(面向記錄)處理,為此必須協調這兩種不同的處理方式,目前大多使用游標(curor)技術來進行協調,關于游標的定義和使用方法將在稍后闡述。
嵌入式SQL程序的組成
一個帶有嵌入式SQL的程序一般包括兩大部分:程序首都和程序體 。程序首都是由一些說明性語句組成,而程序體則由一些可執行語句組成。
程序首都
程序首部主要包括的語句有:
①聲明段:用于定義主變量。主變量既可以被主語言語句使用,也可以被SQL語句使用,所以也稱共享變量。主變量在EXEC SQL BECIN DECLARE SECTION; 和 EXEC SQL END DECLARE SECTION;之間進行說明。
②定義SQL通信區:使用EXEC SQL INCLUDE SQLCA語句定義用于在程序和DBMS之間通信的通信區。SQLCA中包含兩個通信變量SQLCODE和SQLSTATE。SQLCODE變量是一個整數變量,當執行了數據庫命令之后,DBMS會返回一個SQLCODE值。如果這個值是0,則表明DBMS已成功執行此語句。如果SQLCODE>0,則表明在該查詢結果中沒有的更多可用的數據(記錄)。如果SQLCODE<0,則表明出現了錯誤。SQLSTATE 是一個帶有5 個字符的字符串。如果SQLSTATE的值為00000則表示沒有錯誤或異常;如果是其他值,就表明出現了錯誤或異常。
③其他說明性語句
程序體
程序體由若干個可執行的SQL語句和主語言語句組成。包括建立和關閉與數據庫連接的語句。
建立與一個數據庫連接的SQL命令如下:
EXEC SQL CONNECT TO <服務器名> AS <連接名> AUTHORIZATION <用戶賬戶名和口令>;
或者如下:
EXEC SQL CONNECT:<用戶名> identified by:<用戶口令> using:<數據庫服務器路徑>;
一般情況下 ,由于一個用戶或程序可以訪問多個數據庫服務器,因此可以建立多個連接,但是任何時刻只能有一個連接是活動的。用戶可以使用<連接名>將當前活動的連接轉換為另一個連接,命令如下:
EXEC SQL SET CONNECTION <連接名>;
如果不再需要某個連接了,可以使用如下命令終止這個連接:
EXEC SQL DISCONNECT <連接名>;
在嵌入式SQL中使用游標檢索多個元組
一般來說,一個SQL查詢一次可以檢索多個元組,而主語言程序通常是"一次一個元組"處理,可以使用游標協調這兩種不同的處理方式。
與游標相關的SQL語句有下列四個:
游標定義語句
EXEC SQL DECLARE <游標名> CURSOR FOR <SELECT語句>;
游標打開語句
EXEC SQL OPEN <游標名>;
游標推進語句
EXEC SQL FETCH <游標名> INTO [<:主變量名>[,<:主變量名>]...];
游標關閉語句
EXEC SQL CLOSE <游標名>;
嵌入式SQL程序實例
下面使用一個案例來對嵌入式SQL進行一個講解,幫助讀者更好地理解嵌入式 SQL的使用,在本案例中使用的宿主語言為C語言。
案例需求: 現有一數據庫,內含一張數據庫表customers,表中主要存儲了客戶的專屬折扣和id號。每個客戶有且只有一個專屬折扣,即在表中每條數據都是唯一的。在C語言中使用嵌入式SQL語句,輸入相關客戶的id號,查找輸出數據庫的customer表中相關客戶的信息,數據庫用戶名和服務器名均為175_178_184_206。
#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表示SQL的通信區, communication areachar cid_prompt[]="please enter customer id:";--輸入查詢的客戶編號變量cidint main(){? ? exec sql begin declare section; --下面聲明變量? ? char cust_id[5], cust_name[14];--客戶id號和客戶姓名? ? float cust_discnt;--客戶折扣? ? exec sql end declare section;? ? exec sql whenever sqlerror goto report_error;-- 錯誤捕獲? ? exec sql whenever not found goto notfound; ?-- 記錄沒有找到? ? exec sql connect:"customer" identified by:"xxxxxx" using:"url"; ?-- 連接數據庫? ? --另注:因為隱私保密原因? ? --在此數據庫密碼使用了xxxxxx代替? ? --數據庫服務器路徑使用了url代替? ? --實際使用時根據自己需求替換? ? while((prompt(cid_prompt,1,cust_id,4))>=0){? ? ? ? exec sql select cname,discnt into :cust_name,:cust_discnt? ? ? ? from customers where cid=:cust_id; -- 根據輸入的客戶id 找到名字和折扣? ? ? ? exec sql commit work;-- 提交? ? ? ? printf("customer"s name is %s and discount?? ? ? ? is %.1f\n",cust_name, cust_discnt);? ? ? ? continue; -- 接著循環,再輸入客戶id?? ? notfound:printf("can"t find customer %s, continuing\n", cust_id);}? ? exec sql commit release; -- 斷開數據庫的連接? ? return 0;? ? report_error: ?-- 前面報錯的執行? ? ? ? print_dberror();--打印報錯? ? ? ? exec sql rollback release; -- 斷開連接? ? ? ? return 1;}
到此這篇關于一文詳解嵌入式SQL的文章就介紹到這了,更多相關嵌入式SQL內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
相關文章: