數據庫——嵌入式SQL
??? 使用嵌入式SQL,必須解決如下幾個問題:
??? (1)SQL語言和宿主語言的數據類型可能不完全一致,必須解決數據類型的轉換問題,這與DBMS和其支持的宿主語言有關。
??? (2)用SQL語句查詢數據庫的結果是元組的集合,而宿主語言只支持數字型、字符性、數組和記錄等數據類型,不支持集合和關系類型。
為此,要通過SQL語句使用的宿主變量逐個地把每個元組傳遞給宿主語言中的程序變量。宿主語言編譯器不能識別和接受在宿主語言中的SQL語句代碼,必須把嵌入有SQL 語句的宿主語言程序翻譯成標準的宿主語言語句再進行編譯,或直接產生可執行的代碼,這是首先要解決的問題。為此,通常先對嵌入有SQL語句的宿主語言程序進行預處理,翻譯成標準的宿主語言語句,再用宿主語言編譯器進行編譯。數據庫和宿主語言之間如何通過宿主變量傳遞數據和信息。
??? (3)在宿主語言程序中如何判斷SQL語句執行的正確或錯誤?
??? 下面對這些問題逐一給出解答。
1.嵌入式SQL語言的使用格式
??? 為了把SQL語句嵌入主程序設計語言中,并且在主程序設計語言的源代碼中能夠區分宿主語言的語句和嵌入的SQL語句,便于預處理程序識別它,必須有開始和結束的語句塊標識符,把SQL語句括在其中。通常在SQL語句前面加上前綴表示"EXEC SQL",并以"END_EXEC"作為語句結束的標志,構成EXEC SQL <SQL 語句> END_EXEC的嵌入語句塊,如下所示:
?
開始標識符:'EXEC SQL'
<嵌入的SQL語句>
結束標識符:'END_SQL'
??? 說明:SQL語句的結束標志隨著宿主語言的不同而有差別。因此,嵌入式SQL的確切語法依賴于宿主語言。當宿主語言為C、PL/1或Pascal時,嵌入語句塊的結束符使用分號';',不使用'END_SQL'。
Oracle數據庫系統提供了Pro*C語言,在C語言中可嵌入SQL語句,以分號';'作為結束標識符。為了方便起見,下面的示例程序中,嵌入語句塊以EXEC SQL開始,用分號';'作為結束標志。
2.共享主變量的聲明
??? 凡在SQL語句中使用的、用于與宿主語言交換數據的變量,稱為宿主變量,簡稱主變量。主變量也必須用開始和結束標識符括起來進行聲明。只有這樣聲明的主變量才能用于SQL與宿主語言交換數據,所以主變量是SQL和宿主語言共享的變量。
??? 主變量是主語言的變量,所以主變量的說明必須遵從宿主語言的規定,但主變量類型必須是兩種語言都能處理的。
主變量的聲明格式:EXEC SQL BEGIN DECLARE SECTION
<SQL 宿主變量說明>
EXEC SQL END DECLARE SECTION
這些共享的變量在宿主語言中使用時同其他變量一樣,當在SQL語句中使用宿主變量時,宿主變量前必須要冠以某種特殊符號,用以區別宿主變量和SQL語句中的列名。Oracle的宿主變量前使用冒號':',SQL Server中使用
'@'
符號。例如,@xy,@post等,稱為SQL Server的局部變量。
在SQL中可以使用共享宿主變量實現與宿主語言之間傳遞具體的值。下面的例子是在C語言中嵌入SQL語句,使用共享宿主變量時在前面加上冒號。
例1:聲明三個主變量,如下描述:
EXEC SQL BEGIN DECLARE SECTION
Char sname[20], ssex[1];
Char sclass[10];
EXEC SQL END DECLARE SECTION
??? 說明:上面的例子夾在嵌入式SQL標識語句之間的是宿主變量的聲明,只有宿主語言和SQL都能處理的變量類型才有意義。中間的語句說明了三個變量 sname,ssex,sclass,都是字符數組,用來保存學生的姓名、性別、班級編號。它們的說明形式必須遵從宿主語言的規定。例如,上面的例子中,就是因為宿主語言是C語言而采用的說明形式。
3.特殊的系統變量
?
??? 每個數據庫管理系統都提供一個專用的系統變量SQLSTATE,記錄SQL語句執行的狀態。每當執行完一個SQL語句之后,一個代碼便被放入到該系統變量SQLSTATE中,該代碼標識SQL語句執行情況。在程序中,要使用SQLSTATE主變量,也必須要事先說明,并在每一個SQL語句之后,檢驗SQLSTATE 的狀態,判斷SQL語句的執行結果。
?
SQLSTATE 的狀態碼為:
SQLSTATE='00000' 表示執行正確,
SQLSTATE='02000' 表示沒有滿足要求的元組。
?
說明SQLSTATE主變量示例:
EXEC SQL BEGIN DECLARE SECTION ;
char SQLSTATE [6]; // 5個字符和一個空字符
EXEC SQL END DECLARE SECTION;
?
檢查SQLSTATE主變量的返回值示例:
EXEC SQL WHENEVER <條件><動作>
?
其中:
條件:為'NOT FOUND'(02000) 或'SQLERROR'(其他碼)
動作:為CONTINUE(繼續執行) 或 GO TO<語句標號>
在宿主語言程序中,依據專用的系統變量的值就可以判斷SQL語句執行的正確與否。如果SELECT語句沒有查到記錄,系統就會把一個錯誤代碼寫入相應系統變量SQLSTATE中,SQLSTATE='00000'表示執行正確。
?
?
-The End-