SQL语言:嵌入式SQL知识笔记
? ? ? ? ? ? ?
?
1、概念
SQL提供了將SQL語(yǔ)句嵌入到某種高級(jí)語(yǔ)言中的使用方式,通常采用預(yù)編譯的方法將SQL語(yǔ)句嵌入高級(jí)語(yǔ)言中。采用的方法由DBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃碼、識(shí)別出SQL語(yǔ)句,把它們轉(zhuǎn)換為主語(yǔ)言調(diào)用語(yǔ)句,這樣可以讓主語(yǔ)言編譯程序能識(shí)別它,最后由主語(yǔ)言的編譯程序?qū)⒄麄€(gè)源程序編譯成目標(biāo)碼。
2、SQL嵌入主語(yǔ)言涉及的幾個(gè)問(wèn)題
區(qū)分主語(yǔ)言語(yǔ)句與SQL語(yǔ)句:通常在SQL語(yǔ)句前加前綴EXEC SQL,結(jié)束標(biāo)志會(huì)跟著主語(yǔ)言不同而不同。
主語(yǔ)言工作單元與數(shù)據(jù)庫(kù)工作單元的通信機(jī)制
1、SQL通信區(qū):向主語(yǔ)言傳遞SQL語(yǔ)句執(zhí)行狀態(tài)信息,使主語(yǔ)言能夠根據(jù)此信息控制程序流程。
2、主變量:也成為共享變量。主語(yǔ)言向SQL語(yǔ)句提供參數(shù)主要通過(guò)主變量,主變量由主語(yǔ)言的程序定義,并用SQl的DECLARE語(yǔ)句說(shuō)明。比如C語(yǔ)言中用法:
exec sql begin delcare p char sno[4],cno[3] int grade; char sqlstate[7] exec sql end declare p根據(jù)共享變量givesno值查詢學(xué)生關(guān)系students 中的學(xué)生姓名、年齡、性別
exec sql select sname,age,sex into :Msno,:Mcno;givensno from studnets where sno:Msno;3、游標(biāo)
SQl語(yǔ)言主要是面向集合的,一條SQL語(yǔ)句可產(chǎn)生或處理多條記錄。而主語(yǔ)言是面向記錄的,一組主變量一次只能放一條記錄,因此引入游標(biāo),通過(guò)移動(dòng)游標(biāo)指針來(lái)決定獲取那一條記錄。
3.1 定義游標(biāo):
exec sql declare<游標(biāo)> cursor for <select 查詢語(yǔ)句> endexec3.2 打開(kāi)游標(biāo)
exec sql open <游標(biāo)名> endexec
該語(yǔ)句執(zhí)行游標(biāo)定義中的select語(yǔ)句,同時(shí)游標(biāo)處于活動(dòng)狀況。游標(biāo)是一個(gè)指針,此時(shí)指向查詢結(jié)構(gòu)的第一行之前。
3.3 推進(jìn)游標(biāo)
exec sql fetch from <游標(biāo)名> into <變量表> endexec該語(yǔ)句使用時(shí),游標(biāo)推進(jìn)一行,并把游標(biāo)指向的行中的值取出來(lái),送到共享變量中去。
3.4 關(guān)閉游標(biāo)
exec sql close <游標(biāo)名> endexec3.5游標(biāo)完整例子
---游標(biāo)更新刪除當(dāng)前數(shù)據(jù) ---1.聲明游標(biāo) declare orderNum_03_cursor cursor scroll for select OrderId ,userId from bigorder where orderNum='ZEORD003402' --2.打開(kāi)游標(biāo) open orderNum_03_cursor --3.聲明游標(biāo)提取數(shù)據(jù)所要存放的變量 declare @OrderId int ,@userId varchar(15) --4.定位游標(biāo)到哪一行 fetch First from orderNum_03_cursor into @OrderId,@userId --into的變量數(shù)量必須與游標(biāo)查詢結(jié)果集的列數(shù)相同 while @@fetch_status=0 --提取成功,進(jìn)行下一條數(shù)據(jù)的提取操作 beginif @OrderId=122182beginUpdate bigorder Set UserId='123' Where Current of orderNum_03_cursor --修改當(dāng)前行endif @OrderId=154074beginDelete bigorder Where Current of orderNum_03_cursor --刪除當(dāng)前行endfetch next from orderNum_03_cursor into @OrderId ,@userId --移動(dòng)游標(biāo)endIT技術(shù)分享社區(qū)
個(gè)人博客網(wǎng)站:https://programmerblog.xyz
文章推薦程序員效率:畫(huà)流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠(yuǎn)程辦公:常用的遠(yuǎn)程協(xié)助軟件,你都知道嗎?51單片機(jī)程序下載、ISP及串口基礎(chǔ)知識(shí)硬件:斷路器、接觸器、繼電器基礎(chǔ)知識(shí)
?
總結(jié)
以上是生活随笔為你收集整理的SQL语言:嵌入式SQL知识笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 异步IO
- 下一篇: oracle出错如何备份数据,备份ora