首頁 > 軟體

一文詳解嵌入式SQL

2023-01-18 14:02:16

嵌入式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 area

char cid_prompt[]="please enter customer id:";--輸入查詢的客戶編號變數cid
int 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 %.1fn",cust_name, cust_discnt);
        continue; -- 接著迴圈,再輸入客戶id 
    notfound:printf("can't find customer %s, continuingn", cust_id);}
    exec sql commit release; -- 斷開資料庫的連線
    return 0;
    report_error:  -- 前面報錯的執行
        print_dberror();--列印報錯
        exec sql rollback release; -- 斷開連線
        return 1;
}

到此這篇關於一文詳解嵌入式SQL的文章就介紹到這了,更多相關嵌入式SQL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com