




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、數(shù)據(jù)庫編程和案例分析 數(shù)據(jù)庫設(shè)計的基本步驟6個階段: 需求分析階段 概念結(jié)構(gòu)設(shè)計 邏輯結(jié)構(gòu)設(shè)計 物理結(jié)構(gòu)設(shè)計 數(shù)據(jù)庫實施 數(shù)據(jù)庫的運行和維護(hù)復(fù)習(xí): 案例1P242例5 將計算機(jī)系全體學(xué)生年齡 置NULL值。 UPDATE Student SET Sage=NULL WHERE Sdept= CS;EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept= CS;案例分析試比較說明兩個語句有什么區(qū)別? 第2個語句有EXEC SQL 。新知識的引入SQL語言提供了兩種不同的 使用方式: 交互式 嵌入式 優(yōu)點:操作統(tǒng)一、面向集合、功能豐富、使用簡單。缺點:缺
2、少流程控制,難以實現(xiàn)應(yīng)用業(yè)務(wù)中的邏輯控制。 原因(標(biāo)準(zhǔn)SQL): SQL編程技術(shù)可以有效克服SQL語言實現(xiàn)應(yīng)用方面的不足,提高應(yīng)用系統(tǒng)和RDBMS間的互操作性。 應(yīng)用系統(tǒng)中使用SQL編程來訪問和管理數(shù)據(jù)庫中數(shù)據(jù)的方式: 嵌入式SQL(Embeded SQL,ESQL) PL/SQL(Procedural Language/SQL) ODBC編程(Open Data Base Connectivity) JDBC編程(Java Data Base Connectivity) OLEDB(Object Linking and Embedding DB)8.1 嵌入式SQL 嵌入式SQL是將SQL語
3、句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C+、Java,稱為宿主語言,簡稱主語言。 為了區(qū)分SQL語句與主語言語句, 所有SQL語句必須加前綴EXEC SQL,以(;)結(jié)束: EXEC SQL ;1. 處理過程預(yù)編譯方法 含ESQL語句的主語言程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用RDBMS的預(yù)處理程序主語言編譯程序目標(biāo)語言程序P238 圖2. 與主語言之間的通信 將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句 。SQL語句(描述性的面向集合的語句) 高級語言語句(過程性的面向記錄的語句) 負(fù)責(zé)操縱數(shù)據(jù)庫 負(fù)責(zé)控制程序流程 它們之間應(yīng)該如何通信?3. 通信方式及內(nèi)容 S
4、QL通信區(qū) ( SQLCA )SQL Communication Area 是一個數(shù)據(jù)結(jié)構(gòu) SQL語句執(zhí)行后,RDBMS把SQL語句的執(zhí)行狀態(tài)信息(當(dāng)前工作狀態(tài) 、運行環(huán)境 )送到SQLCA中。應(yīng)用程序(主語言)從SQLCA中取出這些狀態(tài)信息,據(jù)此控制程序流程 。定義SQLCA EXEC SQL INCLUDE SQLCA 使用SQLCA SQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE ;應(yīng)用程序每執(zhí)行完一條SQL 語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理;如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否
5、則表示出錯。 主變量(Host Variable)嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡稱為主變量向SQL語句提供參數(shù) 。將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理。主變量的類型 輸入主變量 由應(yīng)用程序?qū)ζ滟x值,SQL語句引用。輸出主變量 由SQL語句對其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序。 一個主變量有可能既是輸入主變量又是輸出主變量。指示變量:一個主變量可以附帶一個指示變量(Indicator Variable)。是一個整型變量,用來“指示”所指主變量的值或條件。輸入主變量:可以檢測是否為空值。輸出主變量:可以檢測是否為空值,值是
6、否被截斷。 在SQL語句中使用主變量和指示變量的方法:1)說明主變量和指示變量 BEGIN DECLARE SECTION . . (說明主變量和指示變量) . END DECLARE SECTION 2) 使用主變量 說明之后的主變量可以在SQL語句中任何一個能夠使用表達(dá)式的地方出現(xiàn)。為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(:)作為標(biāo)志。3)使用指示變量 指示變量前也必須加冒號標(biāo)志必須緊跟在所指主變量之后 在SQL語句之外(主語言語句中)使用主變量和指示變量的方法 直接引用,不必加冒號 游標(biāo) 使用游標(biāo) 的原因:SQL語言與主語言具有不同數(shù)據(jù)處理方式
7、。 SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄;主語言是面向記錄的,一組主變量一次只能存放一條記錄 ;僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求;嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式。游標(biāo)是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果。每個游標(biāo)區(qū)都有一個名字 。用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理。4. 建立數(shù)據(jù)庫連接 EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要連接的數(shù)據(jù)庫服務(wù)器;它
8、可以是一個常見的服務(wù)器標(biāo)識串,如:。或者是包含服務(wù)器標(biāo)識的SQL串常量,也可以是DEFAULT。connect-name是可選的連接名;連接必須是一個有效的標(biāo)識符,主要用來識別一個程序內(nèi)同時建立的多個連接。在整個程序內(nèi)只有一個連接時可以不指定連接名。 修改當(dāng)前連接 : 如果程序運行過程中建立了多個連接,執(zhí)行的所有數(shù)據(jù)庫單元的工作都在該操作提交時所選擇的當(dāng)前連接上。程序運行過程中可以修改當(dāng)前連接,對應(yīng)的嵌入式SQL語句為:EXEC SQL SET CONNECTION connection-name|DEFAULT EXEC SQL DISCONNECT connection; 關(guān)閉數(shù)據(jù)庫連接:
9、當(dāng)某個連接上的所有數(shù)據(jù)庫操作完成后,應(yīng)用程序應(yīng)該主動釋放所占用的連接資源。關(guān)閉數(shù)據(jù)庫連接的ESQL的語句為:其中connection-name是EXEC SQL CONNECT所建立的數(shù)據(jù)庫連接。程序?qū)嵗阂来螜z查某個系的學(xué)生記錄,交互式更新某些學(xué)生的年齡。EXEC SQL BEGIN DECLARE SECTION/*主變量說明開始*/char deptname20;char HSno9;char HSname20;char HSsex2;char HSage;int NEWAGE;EXEC SQL END DECLARE SECTION; /*主變量說明結(jié)束*/Long SQLCODE;E
10、XEC SQL INCLUDE sqlca; /*定義SQL通信區(qū)*/int main(void) int count=0;char yn;printf(“please input the department name(CS/MA/IS):”);scanf(“%s”,&deptname);/*為主變量deptname賦值EXEC SQL CONNECT TO TESTlocalhost:54321 USER”SYSTEM”/”MANAGER”;/*連接數(shù)據(jù)庫*/EXEC SQL DECLARE SX CURSOR FOR/*定義游標(biāo)SX*/SELECT Sno,Sname,Ssex,Sage
11、/*SX對應(yīng)的語句*/FROM StudentWHERE SDept=:deptname;EXEC SQL OPEN SX;/*打開游標(biāo)SX,指向查詢結(jié)果的第一行*/for(;)/*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/EXEC SQL FETCH SX INTO:HSno,:HSname,:HSsex,:HSage;/*推進(jìn)游標(biāo),將當(dāng)前的數(shù)據(jù)放入主變量*/if(sqlca.sqlcode!=0) break;/*sqlcode!=0,表示操作不成功*/*利用SQLCA中的狀態(tài)信息決定何時退出循環(huán)*/if(count+=0)printf(“n%-10s%-20s%-10s%-10sn”,”Sno
12、”,”Sname”,”Ssex”,”Sage”);printf(“n%-10s%-20s%-10s%-10sn”,HSno,HSname,HSsex,HSage);/*打印查詢結(jié)果*/printf(“UPDATE AGE(Y/N)?”); /*詢問用戶是否要更新該學(xué)生的年齡*/do scanf(“%d”,&yn);while (yn!=N&yn!=n&yn!=y&yn!=Y) if(yn=y|yn=Y) printf(“INPUT NEW AGE:”); scanf(“%d”,&NEWAGE); /*用戶輸入新的年齡到主變量中*/ EXEC SQL UPDATE Student /*嵌入式SQ
13、L更新語句*/ SET Sage=:NEWAGE WHERE CURRENT OF SX;/*對當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新*/if/forEXEC SQL CLOSE SX;/*關(guān)閉游標(biāo)SX不再和查詢結(jié)果對應(yīng)*/EXEC SQL COMMIT WORK;/*提交更新*/EXEC SQL DISCONNECT TEST/*斷開數(shù)據(jù)庫連接*/5. 不使用游標(biāo)的SQL語句有的ESQL SQL語句不需要使用游標(biāo)。它們是:說明性語句、數(shù)據(jù)定義語句、數(shù)據(jù)控制語句、查詢結(jié)果為單記錄的SELECT語句、非CURRENT形式的增刪語句。 一、查詢結(jié)果為單記錄的SQL語句這類語句不需要使用游標(biāo),因為查詢結(jié)構(gòu)只
14、有一個,只需要用INTO子句指定存放查詢結(jié)果的主變量。 例2根據(jù)學(xué)生號碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號付給了主變量givernsnoEXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROM StudentWHERE Sno=:givensno;使用單記錄的SELECT 語句需要注意以下幾點:(1)INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量。(2)查詢結(jié)果為空值的處理。 查詢返回的記錄中,可能某些列為空值NULL。為了表示空值,在INTO子句的主
15、變量后面跟有指示變量,當(dāng)查詢得出的某個數(shù)據(jù)項為空值時,系統(tǒng)會自動將相應(yīng)主變量后面的指示變量置為負(fù)值,而不再向該主變量賦值。所以當(dāng)指示變量值為負(fù)值時,不管主變量為何值,均認(rèn)為主變量值為NULL(3)如果查詢結(jié)果實際并不是單條記錄,而是多條記錄,則程序出錯,RDBMS會在SQLCA中返回錯誤信息。例3 查詢某個學(xué)生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號付給了主變量givensno,將課程號賦給了主變量givensnoEXEC SQL Sno,Cno,GradeINTO :Hsno,:Hcno,:Hgrade:GradeidFROM SCWHERE Sno=:givensno AND C
16、no=:givencno如果Gradeid0,則不論Hgrade為何值,均認(rèn)為該學(xué)生成績?yōu)榭罩?。二、非Current形式的增、刪、改語句有些增刪改語句不需要使用游標(biāo),不是CURRENT形式的。在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量。例4,例5,例6,例7例4 修改某個學(xué)生選修1號課程的成績EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績已經(jīng)賦給主變量*/ WHERE Sno=:givensno; /*學(xué)號已經(jīng)賦給主變量givensno*/例5 將計算機(jī)系全體學(xué)生年齡置為NULL值Sageid=-1;E
17、XEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdept=CS將指示變量Sageid賦一個負(fù)值后,無論主變量Raise為何值,RDBMS都會將CS系所有學(xué)生的年齡置為空值。它等價于EXEC SQL UPDATE Student SET Sage=:Null WHERE Sdept=CS例6 某個學(xué)生退學(xué)了,現(xiàn)在要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已經(jīng)賦給主變量stdnameEXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdn
18、ame);例7 某個學(xué)生新選修了某門課程,將有關(guān)記錄插入到SC表中。假設(shè)插入的學(xué)號已經(jīng)賦給主變量stdno,課程號已經(jīng)賦給主變量couno。gradeid=-1EXEC SQL INSERTINTO SC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值。6. 使用游標(biāo)的SQL語句必須使用游標(biāo)的SQL語句有:查詢結(jié)果為多條記錄的SELECT語句;CURRENT形式的UPDATE和DELETE語句。一、查詢結(jié)果為多記錄的SQL語句一般情況下,SELECT語句查詢結(jié)果是多條記錄,因此需要用游標(biāo)
19、機(jī)制,將多條記錄一次一條的送主程序處理,從而把對集合的操作轉(zhuǎn)換為對單個記錄的處理。使用游標(biāo)的步驟:(1)說明游標(biāo)。用DECLARE語句為一條SELECT語句定義游標(biāo)。EXEC SQL DECLARE CURSOR FOR;說明:游標(biāo)僅僅是一條說明性語句,這是RDMS并不執(zhí)行SELECT語句。(2)打開游標(biāo)。用OPEN語句將定義的游標(biāo)打開。EXEC SQL OPEN ;說明:打開游標(biāo)實際上是執(zhí)行相應(yīng)的SELECT語句,把查詢結(jié)果取到緩沖區(qū)中。這時游標(biāo)處于活動狀態(tài),指針指向查詢結(jié)果集中的第一條記錄。(3)推進(jìn)游標(biāo)指針并取當(dāng)前記錄。EXEC SQL FETCHINTO , .;說明:其中主變量必須與
20、SELECT語句中的目標(biāo)列表達(dá)式具有一一對應(yīng)關(guān)系。用FETCH語句把游標(biāo)指針向前推進(jìn)一條記錄,同時將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理。通過循環(huán)執(zhí)行FETCH語句逐條取出結(jié)果集中進(jìn)行處理。(4)關(guān)閉游標(biāo)。用CLOSE語句關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源。 EXEC SQL CLOSE;說明:游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系。但被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果想聯(lián)系。二、Current形式的刪、改語句 UPDATE語句和DELETE語句都是集合操作,如果只想修改或刪除其中的記錄,則需要用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄,從中進(jìn)一步找
21、出要修改或刪除的記錄。然后用CURRENT形式的UPDATE和DELETE語句修改或刪除之。即UPDATE語句和DELETE語句中要用子句 WHERE CURRENT OF 來表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄。注意:當(dāng)游標(biāo)定義中的SELECT語句帶有UNION或ORDER BY子句時,或者該SELECT 語句相當(dāng)于定義了一個不可更新視圖時,不能使用CURRENT形式的UPDAT語句和DELETE語句。7. 動態(tài)SQL 前面所講的嵌入式SQL語句中使用的主變量、查詢目標(biāo)列、條件等都是固定的,屬于靜態(tài)SQL語句。靜態(tài)嵌入式SQL語句能夠滿足一般要求,但是某些應(yīng)用可能要到執(zhí)
22、行時才能夠確定要提交的SQL語句,查詢的條件。就要使用動態(tài)SQL來解決此類問題。 動態(tài)SQL方法允許在程序運行過程中臨時“組裝”SQL語句。動態(tài)SQL支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式,給開發(fā)者提供設(shè)計任意SQL語句的能力。一、使用SQL語句的主變量 程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出的變量,這樣的變量稱為SQL語句主變量。SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行。例8創(chuàng)建基本表TESTEXEC SQL BEGIN DECLARE SECTION;const char *stmt =“CREATE TABLE test(a
23、int);”;/*SQL語句主變量*/EXEC SQL END DECLARE SECTION;EXEC SQL EXECUTE IMMEDIATE:stmt/*執(zhí)行語句*/二、動態(tài)參數(shù)動態(tài)參數(shù)是SQL語句中的可變元素,使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定。和前面使用的主變量不同:動態(tài)參數(shù)的輸入不是編譯時完成綁定的,而是通過(prepare)語句準(zhǔn)備主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或主變量完成。使用動態(tài)參數(shù)的步驟:1.聲明SQL語句主變量。變量的SQL內(nèi)容包含動態(tài)參數(shù)(?)2.準(zhǔn)備SQL語句(PREPARE)PREPARE將分析含主變量的SQL語句內(nèi)容,建立語句中包含的動態(tài)參
24、數(shù)的內(nèi)部描述符,并用標(biāo)識它們的整體。 EXEC SQL PREPARE FROM ;3.執(zhí)行準(zhǔn)備好的語句(EXECUTE)EXECUTE將SQL語句分析出的動態(tài)參數(shù)和主變量或數(shù)據(jù)常量綁定作為語句的輸入或輸出變量。EXEC SQL EXECUTEINTO USING例9向TEST中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *stmt=“INSERT INTO test VALUES(?);”;/*聲明SQL主變量*/ EXEC SQL END DECLARE SECTIONEXEC SQL PREPARE mystmt FROM:stmt;.E
25、XEC SQL EXECUTE mystmt USING 100;EXEC SQL EXECUTE mystmt USING 200;本部分小結(jié)在嵌入式SQL中,SQL語句用來與數(shù)據(jù)庫打交道,存取數(shù)據(jù)庫中的數(shù)據(jù)。主語言語句用來控制程序流程以及對取出的數(shù)據(jù)做進(jìn)一步加工處理。SQL與主語言具有不同的數(shù)據(jù)處理方式。SQL是面向集合的,而主語言是面向記錄的。所以嵌入式SQL引入了游標(biāo)的概念,用游標(biāo)來協(xié)調(diào)這兩種不同的處理方式。8.2 存儲過程PL/SQL過程語言塊結(jié)構(gòu)常量變量的定義賦值語句控制結(jié)構(gòu)基礎(chǔ)知識:使用批處理使用腳本使用注釋標(biāo)識符 常量變量T-SQL系統(tǒng)內(nèi)置函數(shù)T-SQL的運算符 T-SQL語言
26、 基礎(chǔ)知識認(rèn)知目標(biāo):了解批、腳本、注釋的含義了解T-SQL語言標(biāo)識符的命名規(guī)則掌握常量的書寫格式和基本用途掌握運算符的使用方法能力目標(biāo):掌握變量的聲明、賦值和顯示方法(重點)掌握系統(tǒng)內(nèi)置函數(shù)的使用方法(難點) 一、使用批處理批處理的含義批處理是一條或多條T-SQL語句的集合,從應(yīng)用程序一次性發(fā)送到SQL Server服務(wù)器,并由服務(wù)器編譯成一個可執(zhí)行單元(執(zhí)行計劃) 。一個批處理以GO語句結(jié)束。在一個GO命令行中不能包含其他T-SQL語句,但可以使用注釋文字。 一、使用批處理特點如果一個批中的某條語句包含了語法錯誤,則整個批都不能被編譯和執(zhí)行。如果一個批中的某條語句出現(xiàn)執(zhí)行錯誤,這時可能有兩個
27、結(jié)果:第一種情況,如:違反約束,僅終止當(dāng)前語句,其前其后語句正常執(zhí)行。第二種情況,如:引用不存在的對象,終止當(dāng)前語句和其后語句,其前語句正常執(zhí)行。一個批中出現(xiàn)的語法和執(zhí)行錯誤,都不影響其前和其后的批。 二、使用腳本定義:存儲在文件(.sql )中的一系列SQL語句,也即一系列按順序提交的批 。腳本可以直接在查詢分析器等工具中輸入并執(zhí)行,也可以保存在文件中,再由查詢分析器打開執(zhí)行。作用:將語句保存為腳本文件,可以使多臺計算機(jī)執(zhí)行相同的操作。例如:將在一臺服務(wù)器的查詢分析器上編寫的SQL語句在另一臺服務(wù)器上運行。三、使用注釋注釋的作用:說明代碼的含義,增強(qiáng)代碼的可讀性;可以把程序中暫時不用的語句注
28、釋掉,使它們暫時不被執(zhí)行,需要時可恢復(fù)。類型:行內(nèi)注釋:用于注釋單行。-(兩個減號)塊注釋:用于注釋多行。/*/四、標(biāo)識符標(biāo)識符的含義是指用戶定義的變量名、函數(shù)名、存儲過程名、庫名、表名、索引名、視圖名等各種名稱。命名規(guī)則標(biāo)識符的長度可以為1-128個字符標(biāo)識符的第一個字符必須為字母、下劃線、#以為首的標(biāo)識符表示1個局部變量。以#為首的標(biāo)識符表示1個臨時數(shù)據(jù)庫對象。對于表或存儲過程,名稱前包含一個#時表示局部臨時對象,而兩個#(“#”)則表示為全局臨時對象。標(biāo)識符內(nèi)不允許有空格,也不允許為SQL中的關(guān)鍵字 五、常量常量的含義在運行過程中保持不變的量,是表示特定數(shù)據(jù)值的符號常量的書寫格式取決于它
29、所表示的值的數(shù)據(jù)類型。課堂練習(xí)2:判斷下列常量是什么類型常量?123 w34 2006-04-24整型常量二進(jìn)制常量浮點型常量精確數(shù)字型常量貨幣常量字符串常量日期時間型常量數(shù)值型常量六、變量 1.類型局部變量:用戶自己定義的變量,用于在語句之間傳遞數(shù)據(jù)局部變量名以符號開頭使用時,必須先聲明全局變量(了解):是系統(tǒng)定義的變量,用于存儲系統(tǒng)的特定信息用戶不能建立全局變量,也不能修改其值全局變量名以符號開頭六、變量 2.局部變量的聲明語法格式declare 變量名 數(shù)據(jù)類型,n 說明數(shù)據(jù)類型可以是系統(tǒng)定義的或用戶定義的類型實例2:分別定義一個整型變量和兩個字符型變量。declare name var
30、char(10) declare age smallint , msg varchar(50)注意:局部變量未被賦值之前,其值為null。六、變量 3.局部變量的賦值語法格式:set 變量=表達(dá)式select 變量=表達(dá)式 ,n說明:select語句不能同時完成賦值和查詢兩種操作實例3:給age、name、msg賦值。select name=劉偉,age=21set msg=歡迎使用SQL Server 2005六、變量 4.局部變量的顯示語法格式為:print 表達(dá)式select 表達(dá)式 ,n 實例4:顯示age、name、msg的值。print nameprint ageselect na
31、me as 姓名, 年齡=age, msg 歡迎詞必須是char、varchar;或可以隱式地轉(zhuǎn)化成字符型的常量或變量表達(dá)式。注意與賦值的區(qū)別。六、變量 5.局部變量的作用域作用域的含義是指可以使用該變量的范圍 。局部變量的作用域從聲明它的地方開始,到聲明它的批處理或存儲過程的結(jié)尾。 六、變量 5.局部變量的作用域?qū)嵗?:分析下列局部變量的作用域,執(zhí)行語句后,會出現(xiàn)什么問題?declare name varchar(10) declare age smallint , msg varchar(50)go - -第1個批結(jié)束select name=劉偉,age=21set msg=歡迎使用SQL
32、 Server 2005 go - -第2個批結(jié)束select name as 姓名, 年齡=age, msg 歡迎詞七、函數(shù) 1.類型字符串函數(shù)求串長len( )、轉(zhuǎn)換為大寫/小寫字母upper() / lower()數(shù)學(xué)函數(shù)Sum( )、avg( )、max( )、min( )、count( )日期和時間函數(shù)求當(dāng)前系統(tǒng)日期:Getdate( ) 數(shù)據(jù)類型轉(zhuǎn)換函數(shù)轉(zhuǎn)換為字符型數(shù)據(jù):Convert( )、cast( )全局變量函數(shù)(了解) 七、函數(shù) 2.常用函數(shù)應(yīng)用實例6:已知msg的值為“歡迎使用SQL Server 2005”,顯示該字串的長度。課堂練習(xí)3:顯示kc表中課程號為“107”的
33、課程名稱的長度。declare changdu smallintselect changdu=len(課程名) from kc where 課程號=107select changdu as 課程名稱的長度declare msg varchar(50) - -聲明變量select msg=歡迎使用SQL Server 2005 - -給變量賦值select len ( msg ) as 字符串的長度 - -顯示變量的值七、函數(shù) 2.常用函數(shù)應(yīng)用實例7:統(tǒng)計xsqk表中的學(xué)生人數(shù),要求顯示信息為“學(xué)生表中共有 XX 名學(xué)生”。use xscj -將xscj庫切換為當(dāng)前庫declare rs sma
34、llint -聲明變量select rs=count(*) from xsqk -給變量賦值print -顯示1個空行print 學(xué)生表中共有 + convert(varchar(3),rs) + 名學(xué)生將數(shù)值型rs的值轉(zhuǎn)換為字符型的值,以便與其它字符進(jìn)行串聯(lián)運算。將字符串進(jìn)行聯(lián)接七、函數(shù) 2.常用函數(shù)應(yīng)用實例8:已知變量x中的值為“ABCDefghi”,要求將其轉(zhuǎn)換為大寫字母并顯示。declare x varchar(20) -聲明變量select x=ABCDefghi -給變量賦值print x -顯示原字符串print upper(x) -顯示轉(zhuǎn)換后的大寫字符串課堂練習(xí)4:將x中的字符
35、串轉(zhuǎn)換成小寫字母輸出。七、函數(shù) 2.常用函數(shù)應(yīng)用實例9:顯示系統(tǒng)當(dāng)前的日期。select getdate( )print getdate( )實例10:求xsqk表中陳偉的年齡,并顯示為“年齡是:XX歲?!?。declare a varchar(30)select a = convert(varchar(4), datediff (yy, 出生日期 , getdate() ) ) from xsqk where 姓名=陳偉print 年齡是: + a + 歲。七、函數(shù) 2.常用函數(shù)應(yīng)用課堂練習(xí)5:將系統(tǒng)當(dāng)前的日期顯示為“現(xiàn)在的時間是:XX”。print 現(xiàn)在的時間是:+ convert(varc
36、har(30), getdate( )print 現(xiàn)在的時間是:+ cast(getdate( ) as varchar(30)T-SQL語言流程控制語句基礎(chǔ)知識:流程控制語句概述beginend語句ifelse、if exists語句while、break和continue語句waitfor語句return 語句一、流程控制語句概述T-SQL語言與其它高級語言一樣,提供了可以控制程序執(zhí)行流程的語句。使用這些流程控制語句可以更好地組織和控制程序的流程。類型語句塊:beginend條件語句:ifelse、if exists循環(huán)語句:while、break、continue等待語句:waitfor
37、返回語句:return轉(zhuǎn)移語句:goto(了解)二、beginend語句語句格式:begin 語句 | 語句塊 end作用可以將多條T-SQL語句封裝起來,構(gòu)成一個獨立的語句塊。Begin和end必須成對出現(xiàn)。語句塊的開始語句塊的結(jié)束三、 ifelse、if exists語句語法格式:if 邏輯表達(dá)式 語句 | 語句塊 else 語句 | 語句塊 作用:按條件控制程序的執(zhí)行。當(dāng)條件滿足時,則在執(zhí)行條件之后的T-SQL 語句。否則,就執(zhí)行else后的T-SQL語句(若ELSE部分存在)。if not exists(select語句) 語句 | 語句塊 else 語句 | 語句塊 三、 ifels
38、e語句實例1:查詢學(xué)號為“020101”的平均分是否超過了85分,若超過,則輸出“XX考出了高分”的信息;否則輸出“考的一般”。use xscjdeclare xm varchar(10)if (select avg(成績) from xs_kc where 學(xué)號= 020101 ) 85 begin select xm= 姓名 from xsqk where 學(xué)號= 020101 print xm + 考出了高分 end else print 考的一般從學(xué)生情況表中取姓名求指定學(xué)號的平均成績?nèi)?ifelse語句課堂練習(xí)1:測試xscj庫的xsqk表中是否有“田麗”這個人,若有則顯示其信息,
39、若無則顯示“沒有XX這個人!”。use xscjdeclare xm varchar(20)select xm = 田麗if exists (select * from xsqk where 姓名=xm ) select * from xsqk where 姓名=xm else print 沒有“ + xm + ”這個人!測試“學(xué)生情況表”中是否有這個人四、while、break和continue語句語法格式:while 邏輯表達(dá)式 語句 | 語句組 break 語句 | 語句組 continue 說明:Break用于退出最內(nèi)層的while循環(huán)。Continue用于重新開始一次while循環(huán)。
40、四、while、break和continue語句實例2:計算1到100中奇數(shù)的和,要求顯示為“奇數(shù)和為:XX”。declare i int, sum intselect i = 1, sum = 0while i 100 begin set sum = sum + i set i = i +2 endprint 奇數(shù)和為:+ cast(i as varchar(5)四、while、break和continue語句課堂練習(xí)2:計算500以內(nèi)能被3或7整除的數(shù)。declare i intselect i = 1while i 21if n=0 print 年齡大于21的學(xué)生人數(shù)有: + cast(
41、 n as varchar(5) )else print 沒有年齡大于21的學(xué)生存儲過程必備知識:使用批處理、腳本、注釋標(biāo)識符、常量、變量T-SQL系統(tǒng)內(nèi)置函數(shù)流程控制語句beginend語句ifelse、if exists語句while、break和continue語句waitfor語句return語句存儲過程和觸發(fā)器 存儲過程的使用認(rèn)知目標(biāo):掌握存儲過程的定義及優(yōu)點了解常用的系統(tǒng)存儲過程能力目標(biāo):掌握存儲過程的創(chuàng)建和執(zhí)行(重點)掌握存儲過程中輸入?yún)?shù)和輸出參數(shù)的設(shè)置和使用方法。 (難點)一、存儲過程的基本概念1.存儲過程的含義及功能存儲過程的含義是一組預(yù)先寫好的能實現(xiàn)某種功能的T-SQL程
42、序,是存儲在服務(wù)器上的預(yù)編譯集合。存儲過程是一種獨立的數(shù)據(jù)庫對象,在服務(wù)器上創(chuàng)建和運行。類似于編程語言中的過程或函數(shù)。一、存儲過程的基本概念2.存儲過程的優(yōu)點模塊化編程執(zhí)行速度快效率高存儲過程在執(zhí)行1次后,其執(zhí)行計劃就保存在內(nèi)存中,以后在執(zhí)行時就不必再進(jìn)行編譯和優(yōu)化。減少網(wǎng)絡(luò)流量由于存儲過程是存在服務(wù)器上的一組T-SQL,在客戶端調(diào)用時,可以只用一條調(diào)用語句即可執(zhí)行。提供一種安全機(jī)制可以限制用戶訪問存儲過程中涉及到的表的權(quán)限,只授予執(zhí)行存儲過程的權(quán)限,用戶只能通過存儲過程來訪問表,從而保證了數(shù)據(jù)的安全性。一、存儲過程的基本概念3.存儲過程的類型系統(tǒng)存儲過程是指由SQL Server提供的存儲過
43、程,可以作為命令執(zhí)行。系統(tǒng)存儲過程定義在系統(tǒng)數(shù)據(jù)庫master中,其前綴是sp_。用戶存儲過程 是由用戶在當(dāng)前數(shù)據(jù)庫中創(chuàng)建的存儲過程。最好不要以sp開頭。若用戶定義的存儲過程與系統(tǒng)存儲過程同名,用戶定義的存儲過程永遠(yuǎn)不會執(zhí)行。二、創(chuàng)建和執(zhí)行存儲過程1.簡單存儲過程創(chuàng)建格式:create procedure 存儲過程名 as SQL語句 說明:create procedure不能與別的T-SQL語句位于同一個批中。相應(yīng)的執(zhí)行格式:exec 存儲過程名二、創(chuàng)建和執(zhí)行存儲過程1.簡單存儲過程實例1:創(chuàng)建1個簡單的存儲過程p_cj1,查詢所有學(xué)生的學(xué)號、姓名、課程號和成績信息,并按成績降序排列。use
44、 xscj go create procedure p_cj1 as select xsqk.學(xué)號,姓名,課程號,成績 from xsqk, xs_kc where xsqk.學(xué)號=xs_kc.學(xué)號 order by 4 descgoexec p_cj1 -執(zhí)行存儲過程二、創(chuàng)建和執(zhí)行存儲過程2.使用輸入?yún)?shù)創(chuàng)建格式:create procedure 存儲過程名 形參 數(shù)據(jù)類型 =默認(rèn)值 ,n as SQL語句 相應(yīng)的執(zhí)行格式:execute 存儲過程名 實參= 值 ,n 輸入?yún)?shù)的傳遞方式有兩種:按位置傳遞:直接給出參數(shù)的值,實參與形參一一對應(yīng)通過參數(shù)名傳遞:使用“參數(shù)名=參數(shù)值“的形式,參數(shù)
45、可以任意順序給出。輸入形參:接收從外部傳遞給存儲過程的數(shù)據(jù)。輸入實參:將數(shù)據(jù)傳遞給存儲過程。二、創(chuàng)建和執(zhí)行存儲過程2.使用輸入?yún)?shù)實例2:創(chuàng)建1個帶有輸入?yún)?shù)的存儲過程p_cj2,查詢指定課程號(作為輸入?yún)?shù))的學(xué)生成績信息。create procedure p_cj2 kch char(3)=101 -有默認(rèn)值的輸入形參:接收外部傳遞的數(shù)據(jù) as select * from xs_kc where 課程號= kchgoexec p_cj2 -(1)使用默認(rèn)值執(zhí)行存儲過程exec p_cj2 102 -(2)按位置傳遞參數(shù)exec p_cj2 kch=103 -(3)通過參數(shù)名傳遞參數(shù)輸入實參:將數(shù)據(jù)傳遞給存儲過程。二、創(chuàng)建和執(zhí)行存儲過程2.使用輸入?yún)?shù)課堂練習(xí)1:創(chuàng)建并執(zhí)行帶輸入?yún)?shù)的存儲過程p_xsqk,查詢指定學(xué)號(作為輸入?yún)?shù))的學(xué)生姓名、課程號、成績。 create procedure p_xsqk xh char(6) as select 姓名,課程號,成績 from xsqk , xs_kc where xsqk.學(xué)號=xs_kc.學(xué)號 and xsqk.學(xué)號= xhgoexec p_xsqk 020102 -(1)按位置傳遞參數(shù)exec p_xsqk xh=020103 -(2)通過參數(shù)名傳遞參數(shù)注意:因輸入?yún)?shù)沒
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年拉鏈配件輔料項目可行性研究報告
- 爸爸去哪兒觀后感 15篇
- 保險理財電子合同范本
- 公司貨物供貨合同范本
- 物流行業(yè)中的移動支付應(yīng)用及前景分析
- 代銷區(qū)域保護(hù)合同范本
- 會所轉(zhuǎn)讓合同范本寫
- 魚種購銷合同范本
- 個人基金投資委托合同范本
- 作者意向簽約合同范本
- 計算機(jī)教室(微機(jī)室)學(xué)生上機(jī)使用記錄
- 第1章 會展經(jīng)濟(jì)概述
- 《植物學(xué)》練習(xí)(二)根、莖、葉營養(yǎng)器官的聯(lián)系及變態(tài)
- 中暑-紅十字應(yīng)急救護(hù)培訓(xùn)課件
- 中國農(nóng)業(yè)銀行筆試真題
- (5.5)-雜草圖片農(nóng)田雜草及防除學(xué)
- 生理學(xué)人體生理功能的調(diào)節(jié)
- 口腔護(hù)理技術(shù)
- 西師版四年級下冊100道口算題大全(全冊齊全)
- TFCC損傷的診斷及治療
- 《西藏度亡經(jīng)》及中陰解脫竅決(收藏)
評論
0/150
提交評論