數(shù)據(jù)庫高級SQl相關(guān)技術(shù).ppt_第1頁
數(shù)據(jù)庫高級SQl相關(guān)技術(shù).ppt_第2頁
數(shù)據(jù)庫高級SQl相關(guān)技術(shù).ppt_第3頁
數(shù)據(jù)庫高級SQl相關(guān)技術(shù).ppt_第4頁
數(shù)據(jù)庫高級SQl相關(guān)技術(shù).ppt_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

評論

0/150

提交評論