3.7 嵌入式SQL

能夠放入全部高級語言中去,如Csql

                      由於,SQL是過程性語句,須要高級語言的非過程性處理集合的分類處理數據庫

1、通常形式測試

  • 全部的SQL語句都必須加前綴EXEC SQL
  • SQL語句完成結束標誌(;或END EXEC)                        
EXEC SQL<SQL語句>EXEC SQL<SQL語句> END EXEC

例:fetch

EXEC SQL drop table Student;

2、嵌入式SQL語言與主語言之間的通訊spa

  • 向主語言傳遞SQL語言的執行狀態信息,使主語言可以根據此信息控制程序流程,主要使用SQL通訊區(SQLCA);
  • 主語言向SQL語句提供參數,主要用主變量實現;
  • 將SQL語句查詢數據庫結果交主語言進行處理,主要用主變量和遊標實現。

1.SQL通訊區(SQLCA)指針

1)用EXEC SQL INCLUDE SQLCA進行定義;code

2)每執行完一條SQL語句應測試返回代碼SQL CODE的值,以瞭解執行狀況並作相應處理對象

SQLCODEblog

           =0:SQL語句執行成功,並知足條件的記錄;get

           =100:SQL語句處理完最後一條知足條件的記錄或者是數據庫中沒有知足條件的記錄;

           <0:SQL語句執行出錯

2.主變量

主變量:SQL語句中使用的主語言程序變量

指示變量:指示變量的值或條件

  • 必須在SQL語句BEGIN DECLARE SECTION與END DECLARE SECTION之間進行說明;
  • 主變量能夠在SQL語句中任一可以使用表達式的地方出現
  • SQL語句中的主變量名前要加上冒號(:)做爲標誌,與數據庫對象區別
  • 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...

 

  • 查詢結果爲單記錄的select語句

         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;

 

  • 非current形式的update語句
exec sql update SC set Grade=Grade+:raise where Cno='1';
exec sql update Student set Sage=null where Sdept='CS'

 

  • 非current形式的delete語句
exec sql delete from SC where Sno=(select Sno from Student where Sname=:stdna);
  • insert語句

gradeid=-1;    指示變量

exec sql insert into SC(Sno,Cno,Grade) values (:Sno,:Cno,:Grade,:gradeid);

 

4、使用遊標的SQL語言

  • 查詢結果爲多條結果的select語句
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;//關閉遊標
};
...

 

  • current形式的update和delete語句
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;//關閉遊標
...
相關文章
相關標籤/搜索