




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本章內(nèi)容ClicktoaddTitle1函數(shù)4ClicktoaddTitle1嵌入式SQL5ClicktoaddTitle2數(shù)據(jù)庫(kù)連接6ClicktoaddTitle2
XML數(shù)據(jù)庫(kù)7
在數(shù)據(jù)庫(kù)中,游標(biāo)是一個(gè)十分重要的概念。關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)質(zhì)是面向集合的,在關(guān)系數(shù)據(jù)庫(kù)中并沒(méi)有一種描述表中單一記錄的表達(dá)形式,除非使用where子句來(lái)限制只有一條記錄被選中。因此我們必須借助于游標(biāo)來(lái)進(jìn)行面向單條記錄的數(shù)據(jù)處理。游標(biāo)是DBMS為用戶開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),用于存放SQL語(yǔ)句的執(zhí)行結(jié)果。游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條SQL選擇語(yǔ)句(Select)相關(guān)聯(lián)。因?yàn)橛螛?biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語(yǔ)句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。游標(biāo)概述
每一個(gè)游標(biāo)必須有四個(gè)組成部分(1)聲明(DECLARE)游標(biāo);(2)打開(kāi)(OPEN)游標(biāo);(3)從一個(gè)游標(biāo)中逐條獲取(FETCH)并處理記錄信息;(4)關(guān)閉(CLOSE)或釋放(DEALLOCATE)游標(biāo)。游標(biāo)游標(biāo)操作
將RecipeDetail中的處方編號(hào)為“1284041”所包含的藥品信息聲明為MedicineList游標(biāo)。DECLAREMedicineListCURSORFORSELECTM.Mno,D.Mamount,M.Mname,M.Mprice,M.Munit,M.MtypeFROMRecipeDetailDLEFTJOINMedicineMOND.Mno=M.MnoWHERED.Rno='1284041'游標(biāo)聲明游標(biāo)
DECLARE@MnoVARCHAR(50);DECLARE@MnameVARCHAR(50);DECLARE@MtypeVARCHAR(50);DECLARE@MunitVARCHAR(50);DECLARE@MamountINTEGER;DECLARE@MpriceDECIMAL(8,2);DECLAREMedicineListCURSORFOR SELECTM.Mno,D.Mamount,M.Mname,M.Mprice,M.Munit,M.Mtype FROMRecipeDetailDLEFTJOINMedicineMOND.Mno=M.Mno WHERED.Rno='1284041';OPENMedicineList;FETCHNEXTFROMMedicineListINTO@Mno,@Mamount,@Mname,@Mprice,@Munit,@Mtype;WHILE(@@Fetch_Status=0) BEGIN PRINT'編號(hào):'+@Mno+';數(shù)量:'+LTRIM(STR(@Mamount))+‘名稱:’+@Mname;
FETCHNEXTFROMMedicineListINTO@Mno,@Mamount,@Mname,@Mprice@Mtype; ENDCLOSEMedicineList;DEALLOCATEMedicineList;游標(biāo)游標(biāo)示例ClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本章內(nèi)容ClicktoaddTitle1函數(shù)4ClicktoaddTitle1嵌入式SQL5ClicktoaddTitle2數(shù)據(jù)庫(kù)連接6ClicktoaddTitle2
XML數(shù)據(jù)庫(kù)7
存儲(chǔ)過(guò)程是一組已被編輯在一起的,存儲(chǔ)在服務(wù)器上的執(zhí)行某種功能的預(yù)編譯SQL語(yǔ)句。它是一種封裝重復(fù)任務(wù)操作的方法,支持用戶提供的參數(shù)變量,具有強(qiáng)大的編程能力。存儲(chǔ)過(guò)程具有許多優(yōu)點(diǎn):加快程序的執(zhí)行速度減少網(wǎng)絡(luò)的數(shù)據(jù)流量提供了一種安全機(jī)制允許程序模塊化設(shè)計(jì)提高編程的靈活性存儲(chǔ)過(guò)程概述
系統(tǒng)存儲(chǔ)過(guò)程。以sp_開(kāi)頭,用來(lái)進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定、取得信息和相關(guān)管理工作。本地存儲(chǔ)過(guò)程。用戶創(chuàng)建的存儲(chǔ)過(guò)程是由用戶創(chuàng)建并完成某一特定功能的存儲(chǔ)過(guò)程,事實(shí)上一般所說(shuō)的存儲(chǔ)過(guò)程就是指本地存儲(chǔ)過(guò)程。臨時(shí)存儲(chǔ)過(guò)程。臨時(shí)存儲(chǔ)過(guò)程分為兩種存儲(chǔ)過(guò)程:一是本地臨時(shí)存儲(chǔ)過(guò)程,以井字號(hào)(#)作為其名稱的第一個(gè)字符,只有創(chuàng)建它的用戶才能執(zhí)行它;二是全局臨時(shí)存儲(chǔ)過(guò)程,以兩個(gè)井字號(hào)(##)號(hào)開(kāi)始,任意用戶都可以執(zhí)行。遠(yuǎn)程存儲(chǔ)過(guò)程。位于遠(yuǎn)程服務(wù)器上的存儲(chǔ)過(guò)程,使用分布式查詢和EXECUTE命令執(zhí)行。擴(kuò)展存儲(chǔ)過(guò)程。擴(kuò)展存儲(chǔ)過(guò)程是用戶可以使用外部程序語(yǔ)言編寫(xiě)的存儲(chǔ)過(guò)程,而且擴(kuò)展存儲(chǔ)過(guò)程的名稱通常以xp_開(kāi)頭。存儲(chǔ)過(guò)程SQLServer過(guò)程類型
重命名存儲(chǔ)過(guò)程ALTERPROCEDURE舊過(guò)程名稱RENAMETO新過(guò)程名稱;執(zhí)行存儲(chǔ)過(guò)程CALL/PERFORM/EXECUTEPROCEDURE過(guò)程名([參數(shù)1,參數(shù)2,…]);刪除存儲(chǔ)過(guò)程DROPPROCEDURE過(guò)程名();存儲(chǔ)過(guò)程操作
利用存儲(chǔ)過(guò)程計(jì)算患者支付處方中藥品的總金額。CREATEPROCEDUREprocPaymentSum @RecipeNoVARCHAR(10), @PaymentSumDECIMAL(18,2)OUTPUTAS SELECT@PaymentSum=SUM(Mamount*Mprice) FROMRecipeMasterRMLEFTJOINRecipeDetailRDONRM.Rno=RD.Rno INNERJOINMedicineMONM.Mno=RD.Mno WHERERM.Rno=@RecipeNO存儲(chǔ)過(guò)程操作
利用存儲(chǔ)過(guò)程計(jì)算患者支付處方中藥品的總金額。CREATEPROCEDUREprocPaymentSum @RecipeNoVARCHAR(10), @PaymentSumDECIMAL(18,2)OUTPUTAS SELECT@PaymentSum=SUM(Mamount*Mprice) FROMRecipeMasterRMLEFTJOINRecipeDetailRDONRM.Rno=RD.Rno INNERJOINMedicineMONM.Mno=RD.Mno WHERERM.Rno=@RecipeNO執(zhí)行存儲(chǔ)過(guò)程DECLARE@FeeSumDECIMAL(18,2);EXECUTEprocPaymentSum'1282317',@FeeSumOUTPUT;PRINT@FeeSum;存儲(chǔ)過(guò)程操作示例
在存儲(chǔ)過(guò)程中利用游標(biāo)計(jì)算患者支付處方中藥品的總金額。其中要求對(duì)藥品類型為“中藥”的藥品按照價(jià)格的90%計(jì)算。CREATEPROCEDUREprocPaymentSumCursor @RecipeNoVARCHAR(10), @PaymentSumDECIMAL(18,2)OUTPUTASDECLARE@amountINTEGER;DECLARE@priceDECIMAL(8,2);DECLARE@mtypeVARCHAR(10);DECLAREMedicineListCURSORFORSELECTRD.Mamount,M.Mprice,M.MtypeFROMRecipeMasterRMLEFTJOINRecipeDetailRDONRM.Rno=RD.RnoINNERJOINMedicineMONM.Mno=RD.MnoWHERERM.Rno=@RecipeNO;OPENMedicineList;SET@PaymentSum=0;FETCHNEXTFROMMedicineListINTO@amount,@price,@mtype;WHILE(@@fetch_status=0) BEGINIF@mtype='中藥'SET@price=@price*0.9;SET@PaymentSum=@PaymentSum+@amount*@price;FETCHNEXTFROMMedicineListINTO@amount,@price,@mtype; ENDCLOSEMedicineList;DEALLOCATEMedicineList;存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程+游標(biāo)ClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本章內(nèi)容ClicktoaddTitle1函數(shù)4ClicktoaddTitle1嵌入式SQL5ClicktoaddTitle2數(shù)據(jù)庫(kù)連接6ClicktoaddTitle2
XML數(shù)據(jù)庫(kù)7
從本質(zhì)上看,觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程。觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過(guò)程可以通過(guò)存儲(chǔ)過(guò)程名字而被直接調(diào)用。當(dāng)使用INSERT,DELETE,UPDATE命令對(duì)觸發(fā)器所保護(hù)的數(shù)據(jù)進(jìn)行修改時(shí),觸發(fā)器能夠被自動(dòng)激活,從而確保對(duì)數(shù)據(jù)的處理必須符合由這些SQL語(yǔ)句所定義的規(guī)則。除了能夠完成復(fù)雜的完整性約束以外,還可以在主動(dòng)數(shù)據(jù)庫(kù)(ActiveDatabase)的應(yīng)用中對(duì)不同的外部事件做出及時(shí)反應(yīng)。觸發(fā)器雖然不是SQL-92標(biāo)準(zhǔn)的一部分,但已經(jīng)納入SQL:1999標(biāo)準(zhǔn)。很多數(shù)據(jù)庫(kù)廠商在他們的產(chǎn)品中都已經(jīng)包含對(duì)觸發(fā)器的支持。觸發(fā)器概述
觸發(fā)器(Trigger)是數(shù)據(jù)庫(kù)模式的一個(gè)元素。它是一個(gè)能由系統(tǒng)自動(dòng)執(zhí)行對(duì)數(shù)據(jù)庫(kù)修改的語(yǔ)句一個(gè)觸發(fā)器由3部分組成:事件。事件是指對(duì)數(shù)據(jù)庫(kù)的插入、刪除、修改等操作。觸發(fā)器在這些事件開(kāi)始發(fā)生時(shí)將開(kāi)始工作。條件。觸發(fā)器將測(cè)試條件是否成立。如果條件成立,就執(zhí)行相應(yīng)動(dòng)作,否則什么也不做。動(dòng)作。如果觸發(fā)器測(cè)試滿足預(yù)定的條件,那么就由DBMS執(zhí)行這些動(dòng)作,即對(duì)數(shù)據(jù)庫(kù)的操作。觸發(fā)器性能通常比較低。當(dāng)運(yùn)行觸發(fā)器時(shí),系統(tǒng)處理的大部分時(shí)間花費(fèi)在參照其它表的這一處理上,觸發(fā)器所參照的其它表的位置決定了操作要花費(fèi)的時(shí)間長(zhǎng)短。觸發(fā)器概述
創(chuàng)建觸發(fā)器CREATETRIGGER<觸發(fā)器名稱>{BEFORE|AFTER}<觸發(fā)事件>ON<表名>FOREACH{ROW|STATEMENT}[WHEN<觸發(fā)條件>]<觸發(fā)動(dòng)作體>刪除觸發(fā)器DROPTRIGGER<觸發(fā)器名稱>ON<表名>觸發(fā)器操作
定義BEFORE行級(jí)觸發(fā)器
CREATETRIGGERUPDATE_SALBEFOREINSERTORUPDATEOFSal,PosONTeacherFOREACHROWASBEGINIF(new.sal<800)AND(new.Pos=‘教授’)THENnew.Sal=800;ENDIF;END;觸發(fā)器示例ClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本章內(nèi)容ClicktoaddTitle1函數(shù)4ClicktoaddTitle1嵌入式SQL5ClicktoaddTitle2數(shù)據(jù)庫(kù)連接6ClicktoaddTitle2
XML數(shù)據(jù)庫(kù)7
函數(shù)是由一個(gè)或多個(gè)SQL語(yǔ)句組成的子程序,可用于封裝代碼以便重新使用。與編程語(yǔ)言中的函數(shù)類似,數(shù)據(jù)庫(kù)中用戶定義函數(shù)是接受參數(shù)、執(zhí)行操作(例如復(fù)雜計(jì)算)并將操作結(jié)果以值的形式返回的例程。返回值可以是單個(gè)標(biāo)量值或結(jié)果集。用戶定義函數(shù)可以嵌套,嵌套級(jí)別最多可達(dá)32級(jí)。函數(shù)概述
使用用戶定義函數(shù)有以下優(yōu)點(diǎn):(1)允許模塊化程序設(shè)計(jì)。(2)只需創(chuàng)建一次函數(shù)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,以后便可以在程序中調(diào)用任意次。用戶定義的函數(shù)可以獨(dú)立于程序源代碼進(jìn)行修改。(3)執(zhí)行速度更快。與存儲(chǔ)過(guò)程相似,用戶定義函數(shù)通過(guò)緩存計(jì)劃并在重復(fù)執(zhí)行時(shí)重用它來(lái)降低SQL代碼的編譯開(kāi)銷。這意味著每次使用用戶定義函數(shù)時(shí)均無(wú)需重新解析和重新優(yōu)化,從而縮短了執(zhí)行時(shí)間。(4)減少網(wǎng)絡(luò)流量。基于某種無(wú)法用單一標(biāo)量的表達(dá)式表示的復(fù)雜約束來(lái)過(guò)濾數(shù)據(jù)的操作,可以表示為函數(shù)。然后,此函數(shù)便可以在WHERE子句中調(diào)用,以減少發(fā)送至客戶端的數(shù)字或行數(shù)。函數(shù)概述
存儲(chǔ)過(guò)程與函數(shù)一起向用戶提供了強(qiáng)大而靈活的編程能力。存儲(chǔ)過(guò)程和自定義函數(shù)的區(qū)別:(1)存儲(chǔ)過(guò)程,功能強(qiáng)大,可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫(kù)操作。用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫(kù)狀態(tài)的操作。(2)存儲(chǔ)過(guò)程可以使用非確定函數(shù)。自定義函數(shù)不允許在用戶定義函數(shù)主體中內(nèi)置非確定函數(shù)。【注:確定性函數(shù)是在使用特定的輸入值集調(diào)用函數(shù)的任何時(shí)候,它們總是返回相同的結(jié)果。】(3)存儲(chǔ)過(guò)程可返回記錄集。自定義函數(shù)可以返回表變量。(4)存儲(chǔ)過(guò)程的返回值不能被直接引用。自定義函數(shù)的返回值可以被直接引用。(5)存儲(chǔ)過(guò)程用EXECUTE語(yǔ)句執(zhí)行。而自定義函數(shù)在查詢語(yǔ)句中調(diào)用。函數(shù)概述
SQLServer中根據(jù)函數(shù)返回值形式分為三種類型:1.標(biāo)量函數(shù):返回在RETURNS子句中定義的單個(gè)數(shù)據(jù)值。2.內(nèi)聯(lián)表值型函數(shù):內(nèi)聯(lián)表值型函數(shù)以表的形式返回一個(gè)返回值。其返回的表由一個(gè)位于RETURN子句中的SELECT命令段從數(shù)據(jù)庫(kù)中篩選出來(lái)。內(nèi)聯(lián)表值型函數(shù)功能相當(dāng)于一個(gè)參數(shù)化的視圖。用戶定義表值函數(shù)返回TABLE數(shù)據(jù)類型。3.多聲明表值型函數(shù):多聲明表值型函數(shù)可以看作標(biāo)量型和內(nèi)聯(lián)表值型函數(shù)的結(jié)合體。它的返回值是一個(gè)表,返回值的表中的數(shù)據(jù)是由函數(shù)體中的語(yǔ)句插入的。由此可見(jiàn),它可以進(jìn)行多次查詢,對(duì)數(shù)據(jù)進(jìn)行多次篩選與合并,彌補(bǔ)了內(nèi)聯(lián)表值型函數(shù)的不足。函數(shù)類型
所有用戶定義函數(shù)都由兩部分組成:標(biāo)題和正文。函數(shù)可接受零個(gè)或多個(gè)輸入?yún)?shù),返回標(biāo)量值或表。創(chuàng)建標(biāo)量函數(shù):通過(guò)處方編號(hào)計(jì)算該處方總金額。CREATEFUNCTIONfuncRecipeFee(@recipeIDVARCHAR(10))RETURNSDecimal(18,2)ASBEGIN DECLARE@recipeFeeDecimal(18,2) Select@recipeFee=sum(d.Mamount*m.Mprice)FromRecipeDetaildinnerjoinMedicinemond.Mno=d.MnoWhered.Rno=@recipeID
Return@recipeFeeEND函數(shù)操作示例
創(chuàng)建內(nèi)聯(lián)表值型函數(shù):統(tǒng)計(jì)該醫(yī)生為所有患者開(kāi)具的藥品金額和數(shù)量。CREATEFUNCTIONdbo.funcMedicineSales(@DnoVARCHAR(10))RETURNSTABLEASRETURN
(SELECTM.MnameAs'藥品名稱',Sum(RD.Mamount)AS'藥品數(shù)量',SUM(RD.Mamount*M.Mprice)AS'藥品總金額'FROMDoctorAsDINNERJOINRecipeMasterAsRMOnD.Dno=RM.DnoINNERJOINRecipeDetailAsRDOnRM.Rno=RD.RnoINNERJOINMedicineASMOnRD.Mno=M.MnoINNERJOINPatientASPOnRM.Pno=P.PnoWHERED.Dno=@DnoGROUPBYM.Mname);調(diào)用:Select*FromfuncMedicineSales('82')函數(shù)操作示例
創(chuàng)建多聲明表值型函數(shù):通過(guò)用戶指定的部門編號(hào),查詢?cè)摬块T的所有下級(jí)部門,包括該部門的子節(jié)點(diǎn)、子節(jié)點(diǎn)的子節(jié)點(diǎn)、……,直至某節(jié)點(diǎn)為葉節(jié)點(diǎn)為止。CREATEFUNCTIONfuncDescendantDept(@DeptNoVARCHAR(10))RETURNS@DescendantDeptTABLE(DeptNoVARCHAR(10),DeptNameVARCHAR(50),ChildDeptNoVARCHAR(10),ChildDeptNameVARCHAR(50),DeptLevelINT)ASBEGIN
WITHDescendant(DeptNo,DeptName,ChildDeptNo,ChildDeptName,DeptLevel)AS
(SELECTParent.DeptNo,Parent.DeptName,Child.DeptNo,Child.DeptName,1FROMDeptASParentLEFTJOINDeptASChildOnParent.DeptNo= Child.ParentDeptNoWHEREParent.DeptNo=@DeptNo UNIONALLSELECTP.ChildDeptNoASDeptNo,P.ChildDeptNameASDeptName,C.DeptNoASChildDeptNo,C.DeptNameASChildDeptName,P.DeptLevel+1ASDeptLevelFROMDescendantASPINNERJOINDeptASCOnP.ChildDeptNo=C.ParentDeptNo)INSERT@DescendantDeptSELECTDeptNo,DeptName,ChildDeptNo,ChildDeptName,DeptLevelFROMDescendant
RETURNEND;函數(shù)操作示例ClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本章內(nèi)容ClicktoaddTitle1函數(shù)4ClicktoaddTitle1嵌入式SQL5ClicktoaddTitle2數(shù)據(jù)庫(kù)連接6ClicktoaddTitle2
XML數(shù)據(jù)庫(kù)7
SQL語(yǔ)言可以獨(dú)立使用,稱為交互式(InteractiveSQL,ISQL)。但I(xiàn)SQL的功能僅限于數(shù)據(jù)庫(kù)上操作,缺少數(shù)據(jù)處理能力。而一個(gè)應(yīng)用程序既要訪問(wèn)數(shù)據(jù),又要處理數(shù)據(jù),把SQL嵌入到程序設(shè)計(jì)語(yǔ)言,如C,C++,Java等,即宿主語(yǔ)言中,將兩者的功能相結(jié)合起來(lái),是目前解決這個(gè)問(wèn)題的實(shí)現(xiàn)途徑。這樣使用的SQL稱為嵌入式SQL(EmbeddedSQL,ESQL)嵌入式SQL概述
ESQL的處理過(guò)程對(duì)于嵌入式SQL,RDBMS一般采用預(yù)編譯方法處理,即由RDBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識(shí)別出ESQL語(yǔ)句,把它們轉(zhuǎn)換成主語(yǔ)言調(diào)用語(yǔ)句,以使主語(yǔ)言編譯程序能識(shí)別它們,然后由主語(yǔ)言的編譯程序?qū)⒓兊闹髡Z(yǔ)言編譯成目標(biāo)碼嵌入式SQL概述
ESQL與主語(yǔ)言之間的通信數(shù)據(jù)庫(kù)與宿主語(yǔ)言程序間信息的傳遞是通過(guò)共享變量實(shí)現(xiàn)的。這些共享變量先由宿主語(yǔ)言程序定義,再用SQL的DECLARE語(yǔ)句說(shuō)明,隨后SQL語(yǔ)句就可以引用這些變量。共享變量也就成了SQL和宿主語(yǔ)言之間的接口。用SQL通信區(qū)SQLCA向主語(yǔ)言傳遞SQL語(yǔ)句的執(zhí)行狀態(tài)信息在ESQL中,為了能夠區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句,所有的SQL語(yǔ)句都必須加前綴標(biāo)識(shí)“EXECSQL”,并以“END_EXEC”作為語(yǔ)句的結(jié)束標(biāo)志。嵌入式SQL語(yǔ)句的格式如下:EXECSQL<SQL語(yǔ)句>END_EXEC嵌入式SQL概述10.3嵌入式SQL
SQLCA:SQLCommunicationAreaSQLCA是一個(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
用EXECSQLINCLUDESQLCA加以定義使用SQLCASQLCA中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼的變量SQLCODE應(yīng)用程序每執(zhí)行完一條SQL語(yǔ)句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語(yǔ)句執(zhí)行情況并做相應(yīng)處理10.3嵌入式SQL
10.3嵌入式SQL
SQLCA的使用方法SQLCODE=0:SQL語(yǔ)句執(zhí)行成功,并有滿足條件的記錄
=100:SQL語(yǔ)句處理完最后一條滿足條件的記錄或數(shù)據(jù)庫(kù)中沒(méi)有滿足條件的記錄
〈0:SQL語(yǔ)句執(zhí)行出錯(cuò)例1:執(zhí)行DELETE語(yǔ)句后,SQLCODE的不同返回值:
=0:成功刪除若干行
=100:沒(méi)有滿足條件的記錄
〈0:執(zhí)行出錯(cuò)無(wú)條件刪除警告信息違反數(shù)據(jù)保護(hù)規(guī)則,拒絕刪除操作10.3嵌入式SQL
SQLCA的使用方法
允許嵌入的SQL語(yǔ)句引用宿主語(yǔ)言的程序變量(成為共享變量),但有兩條規(guī)定如下。引用共享變量前必須加冒號(hào)“:”作為前綴標(biāo)識(shí),以區(qū)別數(shù)據(jù)庫(kù)中的變量。共享變量由宿主語(yǔ)言的程序定義,并用SQL的DECLARE語(yǔ)句說(shuō)明。例如在C語(yǔ)言程序中可以按如下形式使用共享變量:EXECSQLBEGINDECLARESECTION;
charPno[10];
charPname[50];
charSQL_STATE[6];EXECSQLENDDECLARESECTION;嵌入式SQL概述例3對(duì)某個(gè)部門的醫(yī)生信息,根據(jù)用戶的要求修改其中某些人的年齡字段。思路查詢某個(gè)部門全體醫(yī)生的信息(要查詢的部門名由主變量deptname指定)然后根據(jù)用戶的要求修改其中某些記錄的年齡字段10.3嵌入式SQL
............EXECSQLINCLUDESQLCA;EXECSQLBEGINDECLARESECTION;....../*說(shuō)明主變量deptname,Dno,Dname,Dage,等*/.......EXECSQLENDDECLARESECTION;.....
10.3嵌入式SQL
......gets(deptname);/*為主變量deptname賦值*/......EXECSQLDECLARESXCURSORFORSELECTDno,Dname,DageFROMDoctorWHEREDDept=:deptname
FORUPDATEOFDage;/*說(shuō)明游標(biāo)*/EXECSQLOPENSX/*打開(kāi)游標(biāo)*/10.3嵌入式SQLWHILE(1){/*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/EXECSQLFETCHSXINTO:Dno,:Dname,:Dage;/*將游標(biāo)指針向前推進(jìn)一行,然后從結(jié)果集中取當(dāng)前行,送相應(yīng)主變量*/if(sqlca.sqlcode<>SUCCESS)break;
/*若所有查詢結(jié)果均已處理完或出現(xiàn)SQL語(yǔ)句錯(cuò)誤,則退出循環(huán)*/printf("%s,%s,%d",Dno,Dname,Dage);/*顯示該記錄*/10.3嵌入式SQLprintf("UPDATEAGE?");/*問(wèn)用戶是否要修改*/scanf("%c",&yn);if(yn='y'oryn='Y')/*需要修改*/{printf("INPUTNEWAGE:");scanf("%d",&NEWAge);/*輸入新的年齡值*/
EXECSQLUPDATEStudentSETSage=:NEWAgeWHERECURRENTOFSX;/*修改當(dāng)前記錄的年齡字段*/};10.3嵌入式SQL
............};
EXECSQLCLOSESX;/*關(guān)閉游標(biāo)*/............10.3嵌入式SQLClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本章內(nèi)容ClicktoaddTitle1函數(shù)4ClicktoaddTitle1嵌入式SQL5ClicktoaddTitle2數(shù)據(jù)庫(kù)連接6ClicktoaddTitle2
XML數(shù)據(jù)庫(kù)7
傳統(tǒng)數(shù)據(jù)庫(kù)編程方式是“主語(yǔ)言+DML”。雖然ANSI和ISO定義了關(guān)系數(shù)據(jù)庫(kù)查詢語(yǔ)言標(biāo)準(zhǔn)SQL,但傳統(tǒng)方式中一個(gè)特定的前端應(yīng)用不能訪問(wèn)不同數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù)。各廠商的SQL版本不同,每個(gè)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)廠商都對(duì)標(biāo)準(zhǔn)SQL進(jìn)行了獨(dú)特的擴(kuò)充或解釋,使得不同的RDBMS提供的SQL互不兼容;不同廠商的RDBMS在客戶機(jī)與數(shù)據(jù)庫(kù)服務(wù)器之間用了不同的通信協(xié)議。與此同時(shí),RDBMS產(chǎn)品卻在迅速增加,因此有必要建立一個(gè)公共的、與數(shù)據(jù)庫(kù)無(wú)關(guān)的應(yīng)用程序設(shè)計(jì)接口(ApplicationProgrammingInterface,API)DB連接訪問(wèn)概述
ODBC(OpenDatabaseConnectivity,開(kāi)放數(shù)據(jù)庫(kù)互連)是微軟公司開(kāi)放服務(wù)結(jié)構(gòu)(WOSA,WindowsOpenServicesArchitecture)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分,它建立了一組規(guī)范,并提供了一組對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)API(應(yīng)用程序編程接口)。DB連接訪問(wèn)ODBC應(yīng)用程序應(yīng)用程序應(yīng)用程序公共接口API網(wǎng)絡(luò)軟件SQLServerSybaseOracleDB2MySQL應(yīng)用程序
ODBC的體系結(jié)構(gòu)DB連接訪問(wèn)ODBCSQLServer驅(qū)動(dòng)程序ODBC應(yīng)用程序FoxPro驅(qū)動(dòng)程序SQLServer數(shù)據(jù)源Oracle數(shù)據(jù)源FoxPro數(shù)據(jù)源驅(qū)動(dòng)程序管理器Oracle驅(qū)動(dòng)程序…其他數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序…其他數(shù)據(jù)源
ODBC的開(kāi)發(fā)使用DB連接訪問(wèn)ODBCSQLAllocHandle(ENV)SQLSetEnvAttrSQLAllocHandle(DBC)SQLConnectSelectSQLSetConnectAttrSQLGetInfoSQLAllocHandle(STMT)SQLSetStndAttrSQLExecDirectORSQLPrepareSQLExecuteORUpdate/Delete/insertSQLNumResultColsSQLBindCOLSQLFetchSQLGetDataSQLCloseCursorSQLFreeHandle(STMT)SQLDiscormectSQLFreeHandle(DBC)SQLFreeHandle(ENV)執(zhí)行SQL命令使用結(jié)果集釋放空間ODBC初始化函數(shù)使用ODECAPI檢索數(shù)據(jù)
ADO(ActiveXDataObjects,ActiveX數(shù)據(jù)對(duì)象)是Microsoft提出的應(yīng)用程序接口(API)用以實(shí)現(xiàn)訪問(wèn)關(guān)系或非關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。ADO從原來(lái)的Microsoft數(shù)據(jù)接口遠(yuǎn)程數(shù)據(jù)對(duì)象(RDO)而來(lái)。RDO與ODBC一起工作訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)。DB連接訪問(wèn)ADOSQLAllocHandle(ENV)SQLSetEnvAttrSQLAllocHandle(DBC)SQLConnectSelect
對(duì)
象說(shuō)
明CommandCommand對(duì)象定義了將對(duì)數(shù)據(jù)源執(zhí)行的指定命令Connection代表打開(kāi)的、與數(shù)據(jù)源的連接DataControl將數(shù)據(jù)查詢Recordset綁定到一個(gè)或多個(gè)控件上(如文本框、網(wǎng)格控件或組合框),以便在Web頁(yè)上顯示ADOR.Recordset數(shù)據(jù)DataFactory實(shí)現(xiàn)對(duì)客戶端應(yīng)用程序的指定數(shù)據(jù)源進(jìn)行讀/寫(xiě)數(shù)據(jù)訪問(wèn)的方法DataSpace創(chuàng)建客戶端代理以便自定義位于中間層的業(yè)務(wù)對(duì)象Error包含與單個(gè)操作(涉及提供者)有關(guān)的數(shù)據(jù)訪問(wèn)錯(cuò)誤的詳細(xì)信息Field代表使用普通數(shù)據(jù)類型的數(shù)據(jù)的列Parameter代表與基于參數(shù)化查詢或存儲(chǔ)過(guò)程的Command對(duì)象相關(guān)聯(lián)的參數(shù)或自變量Property代表由提供者定義的ADO對(duì)象的動(dòng)態(tài)特性RecordSet代表來(lái)自基本表或命令執(zhí)行結(jié)果的記錄的全集,任何時(shí)候,Recordset對(duì)象所指的當(dāng)前記錄均為集合內(nèi)的單個(gè)記錄DB連接訪問(wèn)ADOSQLAllocHandle(ENV)SQLSetEnvAttrSQLAllocHandle(DBC)SQLConnectSelect
DB連接訪問(wèn)JDBCSQLAllocHandle(ENV)SQLSetEnvAttrSQLAllocHandle(DBC)SQLConnectSelectJDBC(JavaDataBaseConnectivity,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序,同時(shí),JDBC也是一個(gè)商標(biāo)名。將Java語(yǔ)言和JDBC結(jié)合起來(lái)使程序員只需寫(xiě)一遍程序就可以讓它在任何平臺(tái)上運(yùn)行,這也是Java語(yǔ)言“編寫(xiě)一次,到處運(yùn)行”優(yōu)點(diǎn)的體現(xiàn)。
DB連接訪問(wèn)JDBCSQLAllocHandle(ENV)SQLSetEnvAttrSQLAllocHandle(DBC)SQLConnectSelectJDBC實(shí)際上做了3件事:建立與數(shù)據(jù)庫(kù)的連接、發(fā)送SQL、處理結(jié)果。舉例Connectioncon=DriverManager.getConnection("jdbc:odbc:wombat","login","password");Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery("SELECTDeptNo,DeptName,ManagerFROMDept");While(rs.next()){ StringdeptNo=rs.getString("DeptNo"); StringdeptName=rs.getString("DeptName"); Stringmanager=rs.getString("Manager"); }ClicktoaddTitle1游標(biāo)1ClicktoaddTitle2存儲(chǔ)過(guò)程2ClicktoaddTitle2觸發(fā)器3本
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度豬場(chǎng)租賃與養(yǎng)殖廢棄物資源化利用合作協(xié)議
- 2025年度?;肺锪鞒邪b卸搬運(yùn)及安全防護(hù)合同
- 二零二五年度董事職責(zé)履行與聘任合同
- 2025年度學(xué)生安全教育與應(yīng)急演練合作協(xié)議
- 2025年度醫(yī)院食堂營(yíng)養(yǎng)均衡供餐服務(wù)協(xié)議
- 2025年度農(nóng)產(chǎn)品電商平臺(tái)購(gòu)銷合同圖片制作與物流服務(wù)合同
- 2025年度夫妻共同財(cái)產(chǎn)投資決策及收益共享協(xié)議書(shū)
- 2025年吉林職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及參考答案
- 2025年度保障房東權(quán)益的商鋪?zhàn)赓U合同要點(diǎn)
- 2025年度債務(wù)轉(zhuǎn)移與債務(wù)清償合同范本
- 小班安全《湯姆走丟了》PPT課件教案反思微視頻
- 作物栽培學(xué)課件棉花
- 最新小學(xué)二年級(jí)口算及豎式計(jì)算練習(xí)題
- 生產(chǎn)與運(yùn)作管理-陳榮秋
- 病理生理學(xué)教學(xué)病生6休克課件
- 金雞冠的公雞繪本課件
- 日影朝向及長(zhǎng)短
- 沙盤游戲治療(課堂PPT)
- (完整版)學(xué)生的自我評(píng)價(jià)的表格
- 樸素貝葉斯分類器完整
- 教育系統(tǒng)績(jī)效工資分配方案(共6頁(yè))
評(píng)論
0/150
提交評(píng)論