




已閱讀5頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章 高級(jí)SQL相關(guān)技術(shù),6.1 SQL編程基礎(chǔ) 6.2 事務(wù) 6.3 游標(biāo) 6.4 存儲(chǔ)過(guò)程 6.5 觸發(fā)器 6.6 嵌入式SQL,Sample庫(kù)中幾張表,表6.1 客戶數(shù)據(jù)表,幾張表,表6.2 員工數(shù)據(jù)表,幾張表,表6.3 項(xiàng)目數(shù)據(jù)表,6.1 SQL編程基礎(chǔ),T-SQL是針對(duì)數(shù)據(jù)庫(kù)的查詢語(yǔ)言,它的編程結(jié)構(gòu)比其他程序設(shè)計(jì)語(yǔ)言更為簡(jiǎn)單,一、 批處理,批處理是一組T-SQL語(yǔ)句的集合,可以是一條語(yǔ)句,也可以由多條語(yǔ)句組成。 批處理語(yǔ)句以GO為結(jié)束標(biāo)志。 GO只是個(gè)標(biāo)志語(yǔ)句,并不被執(zhí)行。 在T-SQL存儲(chǔ)過(guò)程調(diào)用時(shí),如果調(diào)用語(yǔ)句不是一段批語(yǔ)句的第一句,則調(diào)用前需要加EXEC; 創(chuàng)建表和創(chuàng)建視圖的語(yǔ)句只能存在于一個(gè)單獨(dú)的批處理語(yǔ)句中,二、變量,變量是T-SQL用來(lái)在其語(yǔ)句間傳遞數(shù)據(jù)的。由系統(tǒng)或用戶定義并賦值。,1、全局變量,全局變量往往用來(lái)記錄數(shù)據(jù)庫(kù)的活動(dòng)狀態(tài)。用“變量名”表示 幾個(gè)常用的全局變量 ERROR返回上一條T-SQL語(yǔ)句執(zhí)行后的狀態(tài)值。如果為0表示語(yǔ)句執(zhí)行正確,非0表示發(fā)生錯(cuò)誤。 FETCH_STATUS返回被FETCH語(yǔ)句執(zhí)行的最后游標(biāo)狀態(tài),如果為0表示FETCH執(zhí)行成功,非0表示發(fā)生錯(cuò)誤。 ROWCOUNT返回上一條T-SQL語(yǔ)句影響到的記錄個(gè)數(shù)。,2、局部變量,用“變量名”表示。聲明局部變量使用DECLARE語(yǔ)句,后面跟上變量名和變量數(shù)據(jù)類型。局部變量賦值可以使用SELECT語(yǔ)句或SET語(yǔ)句 例6.1 USE SAMPLE GO DECLARE Mychar VARCHAR(10),Max_Salary Decimal(7,2) SET Mychar=最高工資 SELECT Max_Salary=MAX(工資) FROM 員工數(shù)據(jù)表,3、函數(shù),常用的函數(shù)有系統(tǒng)函數(shù)、日期函數(shù)、字符串函數(shù)、數(shù)學(xué)函數(shù)以及用戶自定義函數(shù)等,4、程序流程控制,BEGINEND。用于將多條語(yǔ)句組合起來(lái) IFELSE 。用于條件的測(cè)試 WHILE。當(dāng)循環(huán)邏輯表達(dá)式結(jié)果為真時(shí),重復(fù)執(zhí)行后面的語(yǔ)句或語(yǔ)句塊 CASE??梢允褂脩舴奖愕貙?shí)現(xiàn)多重選擇 RETURN。用于無(wú)條件終止查詢、存儲(chǔ)過(guò)程或批處理。,例6.2檢索員工數(shù)據(jù)表,如果存在工資大于5000元的員工,則輸出這些員工的姓名;否則輸出消息,說(shuō)明沒(méi)有員工工資在5000以上。,USE SAMPLE GO DECLARE Message VARCHAR(100) IF ( SELECT MAX(工資) FROM 員工數(shù)據(jù)表) 5000 BEGIN SET Message = 下列人員的工資超過(guò)5000: PRINT Message SELECT 員工姓名,工資 FROM 員工數(shù)據(jù)表 WHERE 工資 5000 END ELSE BEGIN SET Message = 沒(méi)有工資超過(guò)5000的員工。 PRINT Message END GO,例6.3員工發(fā)放的獎(jiǎng)金是工資數(shù)額的30%,判斷是否有員工獎(jiǎng)金少于300,如果有,則將所有員工的工資增加500,直到所有員都多于300或有員工的工資超過(guò)了10000。,USE SAMPLE GO WHILE ( SELECT * FROM 員工數(shù)據(jù)表 WHERE 工資*0.3 10000 BREAK END GO,例6.4分別輸出員工姓名和所在的部門,并在部門后面添加說(shuō)明 。,USE SAMPLE GO SELECT 姓名, “部門說(shuō)明”= /* 分別為個(gè)部門添加說(shuō)明 */ CASE 所屬部門 WHEN 辦公室 THEN 在辦公室工作,該部門主要負(fù)責(zé)各部門的辦公事務(wù)。 WHEN 項(xiàng)目部 THEN 在項(xiàng)目部工作,該部門主要負(fù)責(zé)工程項(xiàng)目事務(wù)。 WHEN 生產(chǎn)部 THEN 在生產(chǎn)部工作,該部門主要負(fù)責(zé)生產(chǎn)事務(wù)。 WHEN 檢驗(yàn)處 THEN 在檢驗(yàn)處工作,該部門主要負(fù)責(zé)產(chǎn)品檢驗(yàn)事務(wù)。 END FROM 員工數(shù)據(jù)表 GO,6.2 事務(wù),一、什么是事務(wù) 二、如何定義事務(wù) 三、事務(wù)的特性,一、什么是事務(wù),事務(wù)(Transaction)是用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單位 事務(wù)和程序是兩個(gè)概念 在關(guān)系數(shù)據(jù)庫(kù)中,一個(gè)事務(wù)可以是一條SQL語(yǔ)句,一組SQL語(yǔ)句或整個(gè)程序 一個(gè)應(yīng)用程序通常包含多個(gè)事務(wù) 事務(wù)是恢復(fù)和并發(fā)控制的基本單位,二、如何定義事務(wù),顯式定義方式 BEGIN TRANSACTION BEGIN TRANSACTION SQL 語(yǔ)句1 SQL 語(yǔ)句1 SQL 語(yǔ)句2 SQL 語(yǔ)句2 。 。 COMMIT ROLLBACK 隱式方式 當(dāng)用戶沒(méi)有顯式地定義事務(wù)時(shí), DBMS按缺省規(guī)定自動(dòng)劃分事務(wù)。,事務(wù)結(jié)束,COMMIT 事務(wù)正常結(jié)束 提交事務(wù)的所有操作(讀+更新) 事務(wù)中所有對(duì)數(shù)據(jù)庫(kù)的更新永久生效 ROLLBACK 事務(wù)異常終止 事務(wù)運(yùn)行的過(guò)程中發(fā)生了故障,不能繼續(xù)執(zhí)行 回滾事務(wù)的所有更新操作 事務(wù)滾回到開(kāi)始時(shí)的狀態(tài),保存點(diǎn),目前在很多DBMS中對(duì)事務(wù)處理除了上述三條語(yǔ)句外,還增加了一條保存點(diǎn)設(shè)置的語(yǔ)句: SAVE TRANSACTION后跟存儲(chǔ)點(diǎn)名代表設(shè)置保存點(diǎn),也可以書(shū)寫(xiě)成SAVE TRAN。,例6.5在員工數(shù)據(jù)表中插入兩行數(shù)據(jù),如果出錯(cuò),則回滾到事務(wù)開(kāi)始處。,BEGIN TRAN tran_exam1 /* 事務(wù)開(kāi)始 */ USE SAMPLE INSERT INTO 員工數(shù)據(jù)表 (員工編號(hào),姓名,工資) VALUES (1000,李曉麗,2400) /* 在員工數(shù)據(jù)表中插入一行數(shù)據(jù)*/ INSERT INTO 員工數(shù)據(jù)表 (姓名,工資) VALUES (張正楓,2000) /* 在員工數(shù)據(jù)表中插入一行,但未插入員工編號(hào)*/ IF error0 ROLLBACK /* 如果插入語(yǔ)句出現(xiàn)錯(cuò)誤則回滾到事務(wù)開(kāi)始*/ COMMIT TRAN tran_exam1 GO,例6.6在員工數(shù)據(jù)表中插入兩行數(shù)據(jù),如果出錯(cuò),則回滾到保存點(diǎn) 。,BEGIN TRAN tran_exam2 USE SAMPLE INSERT INTO 員工數(shù)據(jù)表 (員工編號(hào),姓名,工資) VALUES (1000,李曉麗,2400) SAVE TRAN insertsav /* 在此設(shè)置保存點(diǎn),保存前面的結(jié)果*/ INSERT INTO 員工數(shù)據(jù)表 (姓名,工資) VALUES (張正楓,2000) IF error0 /* 如果插入語(yǔ)句出現(xiàn)錯(cuò)誤則回滾到保存點(diǎn)*/ ROLLBACK TRAN insertsav PRINT “繼續(xù)執(zhí)行程序” COMMIT TRAN tran_exam2 GO,三、事務(wù)的特性(ACID特性),事務(wù)的ACID特性: 原子性(Atomicity) 一致性(Consistency) 隔離性(Isolation) 持續(xù)性(Durability ),6.3 游標(biāo)(cursor),為什么要使用游標(biāo) SQL語(yǔ)言與主語(yǔ)言具有不同數(shù)據(jù)處理方式 SQL語(yǔ)言是面向集合的,一條SQL語(yǔ)句原則上可以產(chǎn)生或處理多條記錄,游標(biāo)(續(xù)),主語(yǔ)言是面向記錄的,一組主變量一次只能存放一條記錄 僅使用主變量并不能完全滿足SQL語(yǔ)句向應(yīng)用程序輸出數(shù)據(jù)的要求 嵌入式SQL引入了游標(biāo)的概念,用來(lái)協(xié)調(diào)這兩種不同的處理方式,游標(biāo)(續(xù)),什么是游標(biāo) 游標(biāo)是系統(tǒng)為用戶開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語(yǔ)句的執(zhí)行結(jié)果 每個(gè)游標(biāo)區(qū)都有一個(gè)名字 用戶可以用SQL語(yǔ)句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語(yǔ)言進(jìn)一步處理,游標(biāo)的使用過(guò)程,打開(kāi)(open),聲明(declare),處理,關(guān)閉(close),解除(deallocate),1. 申明游標(biāo),語(yǔ)句格式 DECLARE 游標(biāo)名稱 SCROLL CURSOR FOR SELECT語(yǔ)句 FOR READ ONLY | UPDATE OF 列1,列2,列3, 是一條說(shuō)明性語(yǔ)句,這時(shí)DBMS并不執(zhí)行SELECT指定的查詢操作。 當(dāng)cursor申請(qǐng)成功后,游標(biāo)名就成為該cursor的識(shí)別,后續(xù)對(duì)該cursor的處理必須指定該游標(biāo)名。游標(biāo)名在同一程序(存儲(chǔ)過(guò)程)內(nèi)不可重復(fù)。,申明游標(biāo)(續(xù)),SCROLL:如果選用了此關(guān)鍵字,表示可以使用相應(yīng)的關(guān)鍵字指定游標(biāo)的移動(dòng)位置。如果不用SCROLL,則表示游標(biāo)的移動(dòng)只能是NEXT。,READ ONLY | UPDATE OF 列1,列2,列3,:設(shè)置游標(biāo)的只讀屬性和更新屬性。方括號(hào)中定義游標(biāo)內(nèi)可更新的列,如果沒(méi)有指定具體的列名,則表示能修改所有的列。,2. 打開(kāi)游標(biāo),語(yǔ)句格式 OPEN ; 功能 打開(kāi)游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語(yǔ)句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中 這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條記錄之前,3. 移動(dòng)游標(biāo)指針,然后取當(dāng)前記錄,語(yǔ)句格式 FETCH NEXT|PRIOR|FIRST|LAST FROM INTO ,.;,4. 關(guān)閉游標(biāo),語(yǔ)句格式 CLOSE ; 功能 關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源 說(shuō)明 游標(biāo)被關(guān)閉后,就不再和原來(lái)的查詢結(jié)果集相聯(lián)系 被關(guān)閉的游標(biāo)可以再次被打開(kāi),與新的查詢結(jié)果相聯(lián)系,例6.7聲明一個(gè)游標(biāo)的基礎(chǔ)上,利用該游標(biāo)變量讀取結(jié)果集中的所有記錄。,USE SAMPLE DECLARE cursor_exam1 CURSOR /* 聲明游標(biāo) */ FOR SELECT * FROM 員工數(shù)據(jù)表 WHERE 所屬部門=項(xiàng)目部 ORDER BY 姓名 FOR READ ONLY OPEN cursor_exam1 /* 打開(kāi)游標(biāo) */ FETCH FROM cursor_exam1 /* 讀取結(jié)果集中的數(shù)據(jù)*/ WHILE FETCH_STATUS = 0 /* 根據(jù)游標(biāo)狀態(tài)來(lái)確定是否繼續(xù)讀取數(shù)據(jù)*/ FETCH FROM cursor_exam1,例6.8使用游標(biāo),將客戶數(shù)據(jù)表中的公司名稱和聯(lián)系人顯示出來(lái)。,USE SAMPLE DECLARE comname VERCHAR(50),conname VARCHAR(10) /* 定義兩變量,類型和客戶數(shù)據(jù)表中的“公司名稱”、“聯(lián)系人”字段相同 */ DECLARE cur_exam2 CURSOR /* 聲明游標(biāo) */ FOR SELECT 公司名稱,聯(lián)系人 FROM 客戶數(shù)據(jù)表 ORDER BY 客戶編號(hào) FOR READ ONLY /* 定義只讀游標(biāo)在查詢“客戶數(shù)據(jù)表”的公司名稱和聯(lián)系人姓名上 */ OPEN cur_exam2 /* 打開(kāi)游標(biāo) */ FETCH FROM cur_exam2 INTO comyname ,conname PRINT “公司名稱:”+ RTRIM(comname)+”聯(lián)系人:”+RTRIM(conname) /* 使用游標(biāo)取查詢結(jié)果集中的第一行數(shù)據(jù)賦給變量并打印出來(lái),同時(shí)給游標(biāo)狀態(tài)賦初值 */,例6.8(續(xù)),WHILE FETCH_STATUS = 0 /* 根據(jù)游標(biāo)狀態(tài)來(lái)確定是否繼續(xù)讀取數(shù)據(jù)*/ BEGIN FETCH FROM cur_exam2 INTO comname ,conname PRINT “公司名稱:”+ RTRIM(comname)+”聯(lián)系 人:”+RTRIM(conname) END /* 循環(huán)取數(shù)直到游標(biāo)狀態(tài)值FETCH_STATUS非0,即沒(méi)有數(shù)據(jù)了 */ CLOSE cur_exam2 /* 關(guān)閉游標(biāo) */ DEALLOCATE cur_exam2 /* 釋放游標(biāo) */,6.4 存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程是一段預(yù)先編譯好地T-SQL程序,有自己的名字,可以作為一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象,也可以作為一個(gè)單元供用戶在應(yīng)用程序中調(diào)用。存儲(chǔ)過(guò)程有以下優(yōu)點(diǎn): 執(zhí)行速度快 提高工作效率 規(guī)范程序設(shè)計(jì) 提高系統(tǒng)的安全性,一、創(chuàng)建存儲(chǔ)過(guò)程,命令的語(yǔ)法為: CREATE PROCEDURE 存儲(chǔ)過(guò)程名稱 parameter data_type OUTPUT ,n WITH RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION AS SQL語(yǔ)句語(yǔ)句組,例6.9在SAMPLE數(shù)據(jù)庫(kù)中創(chuàng)建一存儲(chǔ)過(guò)程,返回指定的時(shí)間段中立項(xiàng)的項(xiàng)目的經(jīng)費(fèi)總額。,USE SAMPLE IF EXISTS(SELECT name FROM sysobjects WHERE name=pro_exam1 AND type=P) DROP PROC pro_exam1 /* 如果數(shù)據(jù)庫(kù)SAMPLE對(duì)象系統(tǒng)表中已經(jīng)有名為pro_exam1的存儲(chǔ)過(guò)程,則刪除 */ CREATE PROC pro_exam1 beginning_data DATETIME ,ending_date DATETIME , all_outlay decimal(9,2) OUTPUT /* 給存儲(chǔ)過(guò)程定義三個(gè)參數(shù):開(kāi)始時(shí)間和結(jié)束時(shí)間以及經(jīng)費(fèi)總額 */ AS SELECT all_outlay=SUM(經(jīng)費(fèi)) FROM 項(xiàng)目數(shù)據(jù)表 WHERE 開(kāi)始時(shí)間 BETWEEN beginning_data AND ending_date /* 查詢出要求的時(shí)間內(nèi)所立項(xiàng)目的經(jīng)費(fèi)總額 */ GO,二、 執(zhí)行和刪除存儲(chǔ)過(guò)程,只有對(duì)存儲(chǔ)過(guò)程有訪問(wèn)權(quán)限的用戶才可以調(diào)用存儲(chǔ)過(guò)程,調(diào)用時(shí)如果不是一個(gè)批的首行用EXECUTE 命令,可簡(jiǎn)寫(xiě)為EXEC。例: DECLARE all_outlay DECIMAL(9,2) EXEC pro_exam12004-1-1,2004-12- 31,all_outlay OUTPUT SELECT 2004年立項(xiàng)的項(xiàng)目總經(jīng)費(fèi)是:RTRIM(CAST(all_outlay AS VARCHAR(10) GO 刪除存儲(chǔ)過(guò)程。 DROP PROC 存儲(chǔ)過(guò)程名稱,6.5 觸發(fā)器,觸發(fā)器是一種數(shù)據(jù)庫(kù)基本表被修改時(shí)自動(dòng)執(zhí)行的內(nèi)嵌程序,當(dāng)使用UPDATE、INSERT、或DELETE命令在指定表中對(duì)數(shù)據(jù)進(jìn)行修改時(shí),用來(lái)保證數(shù)據(jù)正確性。觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語(yǔ)句,它們主要用于強(qiáng)制較為復(fù)雜的業(yè)務(wù)規(guī)則或要求。使用觸發(fā)器能夠幫助保證數(shù)據(jù)的一致性和完整性。 你可把存儲(chǔ)過(guò)程想象成手槍,它必須有人扣扳機(jī)才會(huì)射出子彈,觸發(fā)器則較像地雷,當(dāng)用戶踩到它(條件符合)時(shí)它便會(huì)“引爆”(被執(zhí)行),觸發(fā)器優(yōu)點(diǎn),級(jí)聯(lián)修改數(shù)據(jù)庫(kù)中相關(guān)聯(lián)的表 執(zhí)行比CHECK約束更為復(fù)雜的數(shù)據(jù)完整性約束 使用自定義的錯(cuò)誤信息 比較數(shù)據(jù)表修改前后得數(shù)據(jù) 維護(hù)非規(guī)范化數(shù)據(jù),觸發(fā)器的類型,傳統(tǒng)的觸發(fā)器(INSERT、UPDATE、DELETE):是由一個(gè)動(dòng)作或事件的發(fā)生而觸發(fā)的,現(xiàn)在的Microsoft把它們劃分為AFTER觸發(fā)器。這種類型的觸發(fā)器將在數(shù)據(jù)變動(dòng)完成后才被觸發(fā)。對(duì)變動(dòng)的數(shù)據(jù)進(jìn)行檢查,如果發(fā)現(xiàn)錯(cuò)誤,則拒絕或回滾。 INSTEAD OF觸發(fā)器:這種類型的觸發(fā)器并不是有動(dòng)作或事件觸發(fā),一般在數(shù)據(jù)變動(dòng)之間被觸發(fā),并取代變動(dòng)數(shù)據(jù)的操作(INSERT、UPDATE、DELETE),轉(zhuǎn)而去執(zhí)行觸發(fā)器定義的操作。一般用在視圖操作中。,一、 創(chuàng)建觸發(fā)器,創(chuàng)建觸發(fā)器語(yǔ)法 CREATE TRIGGER 觸發(fā)器名稱 ON 表名|視圖名 WITH ENCRYPTION FOR |AFTER|INSTEAD OF DELETE,INSERT,UPDATE AS SQL 語(yǔ)句組,例6.10在SAMPLE數(shù)據(jù)庫(kù)中,在“員工數(shù)據(jù)表”中創(chuàng)建一觸發(fā)器,實(shí)現(xiàn)在刪除某一員工時(shí),將該員工擔(dān)任負(fù)責(zé)人的項(xiàng)目也刪除 。,USE SAMPLE GO CREATE TRIGGER tri_exam1 ON 員工數(shù)據(jù)表 FOR DELETE /* 在“員工數(shù)據(jù)表”中創(chuàng)建DELETE觸發(fā)器 */ AS IF rowcount = 0 RETURN /* 如果刪除0行,則不啟動(dòng)觸發(fā)器 */ DELETE 項(xiàng)目數(shù)據(jù)表 WHERE 負(fù)責(zé)人編號(hào) IN (SELECT 員工編號(hào) FROM DELETED ) /* 啟動(dòng)觸發(fā)器,刪除“項(xiàng)目數(shù)據(jù)表”中所有以刪除的員工作為負(fù)責(zé)人的項(xiàng)目記錄 */ /*系統(tǒng)提供INSERTED和DELETED兩個(gè)虛擬表。插入一行時(shí),INSERT表保存一份插入行的拷貝。刪除一行時(shí),DELETE表保存了刪除行的拷貝。更新一行時(shí),DELETED和INSERTED表分別保存了更新前后的數(shù)據(jù)。 */,例6.10(續(xù)),IF error !=0 BEGIN ROLLBACK TRAN RETURN END /* 如果觸發(fā)器執(zhí)行過(guò)程中出錯(cuò),則整個(gè)程序回滾到原始狀態(tài) */ RETURN GO 在“員工數(shù)據(jù)表”中創(chuàng)建該觸發(fā)器,如果應(yīng)用程序執(zhí)行以下語(yǔ)句: USE SAMPLE DELETE 員工數(shù)據(jù)表 WHERE 員工編號(hào) = 2011 GO 在刪除“員工數(shù)據(jù)表”中2011號(hào)員工的同時(shí),也刪除了“項(xiàng)目數(shù)據(jù)表中2011號(hào)員工負(fù)責(zé)的項(xiàng)目,二、 刪除觸發(fā)器,語(yǔ)句格式為: DROP TRIGGER 觸發(fā)器名稱,6.6 嵌入式SQL,SQL語(yǔ)言提供了兩種不同的使用方式: 交互式 嵌入式 為什么要引入嵌入式SQL SQL語(yǔ)言是非過(guò)程性語(yǔ)言 事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言 這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語(yǔ)句要做某些必要的擴(kuò)充,一、嵌入式SQL的一般形式,為了區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句,需要: 結(jié)束標(biāo)志:隨主語(yǔ)言的不同而不同 前綴:EXEC SQL 以C為主語(yǔ)言的嵌入式SQL語(yǔ)句的一般形式 EXEC SQL ; 例:EXEC SQL DROP TABLE Student; 以COBOL作為主語(yǔ)言的嵌入式SQL語(yǔ)句的一般形式 EXEC SQL END-EXEC 例: EXEC SQL DROP TABLE Student END-EXEC,DBMS處理宿主型數(shù)據(jù)庫(kù)語(yǔ)言SQL 的方法,預(yù)編譯 修改和擴(kuò)充主語(yǔ)言使之能處理SQL語(yǔ)句,預(yù)編譯,1由DBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識(shí)別出SQL語(yǔ)句 2把它們轉(zhuǎn)換成主語(yǔ)言調(diào)用語(yǔ)句,以使主語(yǔ)言編譯程序能識(shí)別它 3最后由主語(yǔ)言的編譯程序?qū)⒄麄€(gè)源程序編譯成目標(biāo)碼。,嵌入SQL語(yǔ)句,說(shuō)明性語(yǔ)句 嵌入SQL語(yǔ)句 數(shù)據(jù)定義 可執(zhí)行語(yǔ)句 數(shù)據(jù)控制 數(shù)據(jù)操縱 允許出現(xiàn)可執(zhí)行的高級(jí)語(yǔ)言語(yǔ)句的地方,都可以寫(xiě)可執(zhí)行SQL語(yǔ)句 允許出現(xiàn)說(shuō)明語(yǔ)句的地方,都可以寫(xiě)說(shuō)明性SQL語(yǔ)句,二、嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信,將SQL嵌入到高級(jí)語(yǔ)言中混合編程,程序中會(huì)含 有兩種不同計(jì)算模型的語(yǔ)句 SQL語(yǔ)句 描述性的面向集合的語(yǔ)句 負(fù)責(zé)操縱數(shù)據(jù)庫(kù) 高級(jí)語(yǔ)言語(yǔ)句 過(guò)程性的面向記錄的語(yǔ)句 負(fù)責(zé)控制程序流程,工作單元之間的通信方式,1. SQL通信區(qū) 向主語(yǔ)言傳遞SQL語(yǔ)句的執(zhí)行狀態(tài)信息 主語(yǔ)言能夠據(jù)此控制程序流程 2. 主變量 1)主語(yǔ)言向SQL語(yǔ)句提供參數(shù) 2)將SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)的結(jié)果交主語(yǔ)言進(jìn)一步處理 3. 游標(biāo) 解決集合性操作語(yǔ)言與過(guò)程性操作語(yǔ)言的不匹配,1. SQL通信區(qū),SQLCA: SQL Communication Area SQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu) SQLCA的用途 SQL語(yǔ)句執(zhí)行后,DBMS反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運(yùn)行環(huán)境 這些信息將送到SQL通信區(qū)SQLCA中 應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來(lái)執(zhí)行的語(yǔ)句,SQLCA的內(nèi)容,與所執(zhí)行的SQL語(yǔ)句有關(guān) 與該SQL語(yǔ)句的執(zhí)行情況有關(guān) 例:在執(zhí)行刪除語(yǔ)句DELETE后,不同的執(zhí)行情況,SQLCA中有不同的信息: 違反數(shù)據(jù)保護(hù)規(guī)則,操作拒絕 沒(méi)有滿足條件的行,一行也沒(méi)有刪除 成功刪除,并有刪除的行數(shù) 無(wú)條件刪除警告信息 由于各種原因,執(zhí)行出錯(cuò),SQLCA的使用方法,定義SQLCA 用EXEC SQL INCLUDE SQLCA加以定義 使用SQLCA SQLCA中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼的變量SQLCODE 如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語(yǔ)句成功,否則表示出錯(cuò) 應(yīng)用程序每執(zhí)行完一條SQL 語(yǔ)句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語(yǔ)句執(zhí)行情況并做相應(yīng)處理,2. 主變量,什么是主變量 嵌入式SQL語(yǔ)句中可以使用主語(yǔ)言的程序變量來(lái)輸入或輸出數(shù)據(jù) 在SQL語(yǔ)句中使用的主語(yǔ)言程序變量簡(jiǎn)稱為主變量(Host Variable),主變量(續(xù)),主變量的類型 輸入主變量 由應(yīng)用程序?qū)ζ滟x值,SQL語(yǔ)句引用 輸出主變量 由SQL語(yǔ)句賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序 一個(gè)主變量有可能既是輸入主變量又是輸出主變量,主變量(續(xù)),主變量的用途 輸入主變量 指定向數(shù)據(jù)庫(kù)中插入的數(shù)據(jù) 將數(shù)據(jù)庫(kù)中的數(shù)據(jù)修改為指定值 指定執(zhí)行的操作 指定WHERE子句或HAVING子句中的條件 輸出主變量 獲取SQL語(yǔ)句的結(jié)果數(shù)據(jù) 獲取SQL語(yǔ)句的執(zhí)行狀態(tài),主變量(續(xù)),指示變量 一個(gè)主變量可以附帶一個(gè)指示變量(Indicator Variable) 什么是指示變量 整型變量 用來(lái)“指示”所指主變量的值或條件 指示變量的用途 輸入主變量可以利用指示變量賦空值 輸出主變量可以利用指示變量檢測(cè)出是否空值,值是否被截?cái)?主變量(續(xù)),在SQL語(yǔ)句中使用主變量和指示變量的方法 1) 說(shuō)明主變量和指示變量 BEGIN DECLARE SECTION . . (說(shuō)明主變量和指示變量) . END DECLARE SECTION,主變量(續(xù)),2) 使用主變量 說(shuō)明之后的主變量可以在SQL語(yǔ)句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn) 為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語(yǔ)句中的主變量名前要加冒號(hào)(:)作為標(biāo)志,主變量(續(xù)),3) 使用指示變量 指示變量前也必須加冒號(hào)標(biāo)志 必須緊跟在所指主變量之后 在SQL語(yǔ)句之外(主語(yǔ)言語(yǔ)句中)使用主變量和指示變量的方法 可以直接引用,不必加冒號(hào),例6.11從屏幕輸入某一職工的工號(hào)、姓名和工資,插入“員工數(shù)據(jù)表”中。, EXEC SQL INCLUDE SQLCA; /* 定義SQL通信區(qū) */ EXEC SQL BEGIN DECLARE SECTION; /* 主變量說(shuō)明開(kāi)始 */ Int eno; char ename(8); char dno(8); EXEC SQL END DECLARE SECTION; /* 主變量說(shuō)明結(jié)束 */ printf(“請(qǐng)輸入職工工號(hào)、姓名、工資:”); scanf(“%d,%s,%s”, ,例6.12查詢?nèi)靠蛻舻男畔?,然后根?jù)客戶的變更情況修改其中某些客戶的聯(lián)系方式。, EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; Int cus_no; Char link_name(10); char link_addr(50); char new_link_addr(50); EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE cur_update CURSOR FOR /* 定義游標(biāo)cur_update*/ SELECE 客戶編號(hào),聯(lián)系人,聯(lián)系方式 /* 使其與查詢結(jié)果集相聯(lián)系 */ FROM 客戶數(shù)據(jù)表; EXEC SQL OPEN cur_update;,例6.12(續(xù)),while(1) /* 用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄 */ EXEC SQL FETCH cur_update /* 從結(jié)果集中取當(dāng)前行,送相應(yīng)*
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省南平市延平區(qū)2025年七下英語(yǔ)期中綜合測(cè)試試題含答案
- 玩具違法試題及答案
- 土木工程材料試題及答案
- 2025年鍋爐設(shè)備股權(quán)轉(zhuǎn)讓協(xié)議
- 2025年烹飪?cè)O(shè)備采購(gòu)協(xié)議
- 2025年策劃版企業(yè)采購(gòu)合作協(xié)議
- 2025年共同策劃現(xiàn)代物流合作發(fā)展協(xié)議書(shū)
- 2025年兒童領(lǐng)養(yǎng)協(xié)議標(biāo)準(zhǔn)格式
- 2025年度夏令營(yíng)活動(dòng)策劃?rùn)?quán)益保障協(xié)議
- 2025年智能家居設(shè)備銷售合作協(xié)議書(shū)模板
- 理論聯(lián)系實(shí)際談一談如何維護(hù)政治安全?參考答案1
- 2025屆安徽省合肥市A10聯(lián)盟高三下學(xué)期最后一卷歷史試題(B卷)
- 2025屆廣東省東莞中學(xué)七年級(jí)數(shù)學(xué)第二學(xué)期期末聯(lián)考試題含解析
- 2024吉林省農(nóng)村信用社聯(lián)合社招聘筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 2024-2025學(xué)年度部編版一年級(jí)語(yǔ)文下學(xué)期期末試卷(含答案)
- DB13(J)-T 8496-2022 城市污水處理廠提標(biāo)改造技術(shù)標(biāo)準(zhǔn)
- 2025至2030中國(guó)鋰電池粘結(jié)劑市場(chǎng)競(jìng)爭(zhēng)狀況及融資并購(gòu)研究報(bào)告
- 人工智能設(shè)計(jì)倫理知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋浙江大學(xué)
- 2024年福建高考真題化學(xué)試題(解析版)
- 生物醫(yī)學(xué)電子學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年天津大學(xué)
- 美制統(tǒng)一螺紋表UNC,UNF
評(píng)論
0/150
提交評(píng)論