能夠放入全部高級語言中去,如Csql
由於,SQL是過程性語句,須要高級語言的非過程性處理集合的分類處理數據庫
1、通常形式測試
EXEC SQL<SQL語句>; EXEC SQL<SQL語句> END EXEC
例:fetch
EXEC SQL drop table Student;
2、嵌入式SQL語言與主語言之間的通訊spa
1.SQL通訊區(SQLCA)指針
1)用EXEC SQL INCLUDE SQLCA進行定義;code
2)每執行完一條SQL語句應測試返回代碼SQL CODE的值,以瞭解執行狀況並作相應處理對象
SQLCODEblog
=0:SQL語句執行成功,並知足條件的記錄;get
=100:SQL語句處理完最後一條知足條件的記錄或者是數據庫中沒有知足條件的記錄;
<0:SQL語句執行出錯
2.主變量
主變量:SQL語句中使用的主語言程序變量
指示變量:指示變量的值或條件
3.遊標:
用來協調SQL語言和主語言之間的處理速度失調問題(SQL語言:面向集合,可產生或處理多條記錄 主語言:面向記錄,只能存放一條記錄)
系統爲用戶開設的一個數據緩衝區,存放SQL語句的結果。每一個遊標區都有一個名字,用戶可經過遊標逐一獲取記錄,並賦予主變量,交給主語言進一步處理
例:
exec sql include salca; exec sql bedin declare section; char Sno(5); char Cno(3); int Grade; exec sql end declare section; main() { exec sql declare c1 cursor for select Sno,Cno,Grade from SC; exec sql open c1; for(;;) { exec sql fetch c1 into :Sno,:Cno,:grade; if(sqlCode!=0) break; printf("Sno:%s,Cno:%s,Grade:%d\n",:Sno,:Cno,:Grade); } exec sql chose c1; }
3、不用遊標的的SQL語言
exec sql begin declare section; exec sql end declare section;
exec sql create... exec sql drop...
exec sql grant... exec sql revoke...
1)用into子語句制定查詢結果的存放變量
2)into語句,where語句,having短語中都可使用主變量
3)查詢結果若爲多記錄則出錯
exec sql select Sno,Sname,Sage,Sdept into:Sno,:Sname,:Sage,:Sdept from SC where Sno=: give Sno and Cno=:give Cno;
exec sql update SC set Grade=Grade+:raise where Cno='1';
exec sql update Student set Sage=null where Sdept='CS'
exec sql delete from SC where Sno=(select Sno from Student where Sname=:stdna);
gradeid=-1; 指示變量
exec sql insert into SC(Sno,Cno,Grade) values (:Sno,:Cno,:Grade,:gradeid);
4、使用遊標的SQL語言
exec sql begin declare section; ... exec sql end declare section; ... exec sql declare SX cursor for select Sno,Sname,Sage,Ssex from Student where Sdept =:deptname;//說明遊標 while(gets(deptname)!=null) { exec sql open SX;//打開遊標 while(1) { exec sql fecth SX into :Sno,:Sname,:Sage,:Ssex;//推動遊標指針並取當前記錄 if(sqlcode=100) break; } if (sqlcode<0) {printf("error\n"); break; } ... }; exec sql close SX;//關閉遊標 }; ...
exec sql begin declare section; ... exec sql end declare section; ... Gets(deptname); exec sql declare SX cursor for select Sno,Sname,Sage,Ssex from Student where Sdept=:deptname for update of Sage;//聲明遊標 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' or yn='Y') { print ("input new age;"); scanf("%d",&newage); exec sal update Student set Sage =:newage where current of SX; }; ... }; exec sql close SX;//關閉遊標 ...