1)所有的SQL語句都必須加前綴EXEC SQL 2)SQL語句的結尾必須加結束標志( ; 或者 END EXEC) 即一般形式為 EXEC SQL < SQL語句>; 或者 EXEC < SQL語句> END EXEC
例: 使用嵌入式SQL語言刪除Studnet表——–EXEC SQL drop table Student;
一:SQL語句的執行狀態被放到SQL通信區(SQLCA),主語言通過 SQLCA中的SQL語言執行狀態判斷該如何進行下一步操作 二:主語言向SQL語句提供參數。主要用主變量實現 (主語言中使用的變量叫做一般變量,高級語言和SQL語句都需要使用的變量叫做主變量,它是用來作為參數從主語言傳遞給SQL語言) 三: SQL語句查詢的結果通過主變量和游標傳遞給主語言
下面詳細敘述各條標準:
一. SQL通信區(SQLCA) 1)用EXEC SQL INCLUDE SQLCA 進行定義 2)每執行完一條SQL語句應立即測試返回代碼SQLCODE的值,以了解執行情況并做相應處理。因為SQLCA中存放的是最新的SQL語句的執行狀態值,當運行了新的SQL語句時,會將上一條SQL語句的執行狀態值覆蓋掉
3)SQLCODE = 0: SQL語句執行成功,并有滿足條件的記錄 =100:SQL語句處理完最后一條滿足條件的記錄或數據庫中沒有滿足條件的記錄 < 0 : SQL語句執行出錯
例:執行DELETE語句后,SQLCODE的不同返回值: =0:成功刪除若干行 =100:沒有滿足條件的記錄(語法和語意都正確) <0 :執行出錯(語法錯誤或者語意錯誤或者where條件敘述錯誤) 注(返回值<0的其他情況): 1)當需要刪除的記錄被另一個關系表參照時,則數據庫將拒絕刪除操作,此時SQLCODE返回值也小于0 2)當delete操作時未指明刪除條件,則數據庫會給予無條件刪除警告信息,此時SQLCODE的返回值也小于0。 3)當用戶進行刪除操作時,數據庫由于系統資源分配不均,無法響應用戶的操作請求時,也會使SQLCODE返回值小于0)
二. 主變量 1)主變量:SQL語句中使用的主語言程序變量 a.主變量必須在SQL語言BEGIN DECLARE SCETION 與 END DECLARE SECTION之間進行定義 b.主變量可在SQL語言中任何一個能夠使用表達式的地方出現,且可以在主語言中使用 c.SQL語言中的主變量名使用前要加冒號 (:)作為標志,以此與數據庫對象名加以區別 2)指示變量:指示主變量的值或條件 a)SQL語言中的指示變量使用前要加冒號 (:)作為標志,并緊跟在所指示主變量之后 b)SQL語言之外,主變量和指示變量可直接使用 三:游標 系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字。用戶可通過游標逐一獲取記錄,并賦予主變量,交給主語言進一步處理。
下面舉個例子幫助大家理解:
exec sql include sqlca; //數據通信區定義,定義完后用戶可以查詢SQLCODE的值exec sql begin declare section; //主變量定義 char Sno(5); char Cno(3); int Grade;exec sql end declare section; //主變量定義結束int main(){ exec sql declare c1 cursor for select Sno ,Cno,Grade from SC; //定義一個游標(數據緩沖區),其中存放select的結果集 exec sql open c1; //激活游標,即打開游標 for(;;){ exec sql fetch c1 into :Sno, :Cno, :Grade; //fecth即獲取游標中的記錄,首先獲取第一條記錄,然后自動地向下移動以獲取第二條記錄 if(sqlcode !=0) break; //當獲取失敗則退出 四:不用游標的SQL語句說明性語句: exec sql begin declare section; exec sql end declare section; 數據定義語句: exec sql create… exec sql drop… 數據控制語句 exec sql grant… exec sql revoke… 查詢結果為單記錄的select語句 1)用into子句指定查詢結果的存放變量 2)into子句,where子句,having短語中均可使用主變量 3)查詢結果若為多條記錄則程序出錯
再舉個例子: exec sql select Sno,Sname,Sage,Sdept into :Sno,:Sname,:Sage,:Sdept from SC where Sno=:givesno and Cno=:givecno; 所以在主語言中我們就可以對givesno和givecno進行賦值,以達到查詢效果
非current形式的update語句 例1:exec sql update SC set Grade = Grade + :raise where Cno = ‘1’———–將選修了一號課程的學生的分數加上raise
例2:exec sql update Student set Sage = null where Sdept = ‘CS’ ——-此時是將所有的學生的年齡統一置為null,這個統一可以看做是一個整體,所以可以不使用游標方式,而當對于一個集合(非全部)進行操作時就必須使用游標方式了。 非current形式的delete語句 例:exec sql delete from SC where Sno = (select Sno from Student where Sname = :stdname)——–刪除姓名為stdname的學生的所有SC表中的信息
五:使用游標的SQL語句
查詢結果為多條記錄的select語句 例:
exec sql begin declare section;...exec sql end declare section;...exec sql begin declare SX cursor forselect Sno,Sname,Sage,Ssex from Student where Sdept = :deptname; //select查詢的結果一定是多個,所以必須使用游標 where(gets(deptname)!=null) { exec sql open SX; while(1) {exec sql fetch SX into :Sno,:Sname,:Sage,:Ssex; if(sqlcode = 100)//當數據讀取結束,下一條語句返回了100(無法查詢到滿足條件的記錄)則break, break; if(sqlcode<0){ printf("error/n"); break; }/*此處添加當讀取數據成功后執行的代碼*/ }exec sql close SX;current形式的update語句和delete語句 例:
exec sql begin declare section;...exec sql end declare section;...Gets(deptname); //接受用戶輸入放入deptname中exec sql declare SX cursor for select Sno,Sname,Sage,Ssex from Student where Sdept=:deptname for update of Sage; //聲明游標的目的(for update of Sage),這個與后文中的where current of SX是成對出現的exec sql open SX;while(1){ exec sql fetch SX into :Sno,:Sname,:Sage,:Ssex; if(sqlcode!=0) break; printf("%s,%s,%d,%s/n",Sno,Sname,Sage,Ssex); }printf("Update age?/n");scanf("%c",&yn);if(yn = 'y' | yn ='Y'){ printf("input new age"); scanf("%d",&newage); exec sql update Student set Sage=:newage where current of SX;//currentof SX意味著SX游標當前指向的記錄,即此時修改SX游標指向的那條記錄的Sage };...}exsec sql close SX;新聞熱點
疑難解答