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