存儲過程語法及實例_第1頁
存儲過程語法及實例_第2頁
存儲過程語法及實例_第3頁
存儲過程語法及實例_第4頁
存儲過程語法及實例_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

存儲過程如同一門程序設(shè)計語言,同樣包含了數(shù)據(jù)類型、流程控制、輸入和輸出和它自己的函數(shù)庫。 基本語法 創(chuàng)建存儲過程createproceduresp_name()beginend調(diào)用存儲過程基本語法:callsp_name()注意:存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數(shù)傳遞刪除存儲過程基本語法:dropproceduresp_name//注意事項(1)不能在一個存儲過程中刪除另一個存儲過程,只能調(diào)用另一個存儲過程其他常用命令showprocedurestatus顯示數(shù)據(jù)庫中所有存儲的存儲過程基本信息,包括所屬數(shù)據(jù)庫,存儲過程名稱,創(chuàng)建時間等showcreateproceduresp_name顯示某一個mysql存儲過程的詳細(xì)信息 數(shù)據(jù)類型及運算符 一、 基本數(shù)據(jù)類型:略二、 變量:自定義變量:DECLAREaINT;SETa=100; 可用以下語句代替:DECLAREaINTDEFAULT100;變量分為用戶變量和系統(tǒng)變量系統(tǒng)變量又分為會話和全局級變量用戶變量:用戶變量名一般以@開頭,濫用用戶變量會導(dǎo)致程序難以理解及管理1、在mysql客戶端使用用戶變量mysql>SELECT'HelloWorld'into@x;mysql>SELECT@x;mysql>SET@y='GoodbyeCruelWorld';mysql>select@y;mysql>SET@z=1+2+3;mysql>select@z;2、 在存儲過程中使用用戶變量mysql>CREATEPROCEDUREGreetWorld()SELECTCONCAT(@greeting,'World');mysql>SET@greeting='Hello';mysql>CALLGreetWorld();3、 在存儲過程間傳遞全局范圍的用戶變量mysql>CREATEPROCEDUREp1()SET@last_procedure='p1';mysql>CREATEPROCEDUREp2()SELECTCONCAT('Lastprocedurewas',@last_procedure);mysql>CALLp1();mysql>CALLp2();三、運算符:算術(shù)運算符TOC\o"1-5"\h\z+ 力口SETvar1=2+2; 4-減SETvar2=3-2; 1* 乘SETvar3=3*2; 6/除SETvar4=10/3; 3.3333DIV整除SETvar5=10DIV3;3%取模SETvar6=10%3; 1比較運算符> 大于1>2False小于2<1False<= 小于等于2<=2True>= 大于等于3>=2TrueBETWEEN 在兩值之間5BETWEEN1AND10TrueNOTBETWEEN不在兩值之間5NOTBETWEEN1AND10FalseIN 在集合中5IN(1,2,3,4)FalseNOTIN 不在集合中5NOTIN(1,2,3,4)True= 等于2=3False<>,!=不等于2<>3False=> 嚴(yán)格比較兩個NULL值是否相等NULL<=>NULLTrueLIKE簡單模式匹配"GuyHarrison"LIKE"Guy%"TrueREGEXP正則式匹配"GuyHarrison"REGEXP"[Gg]reg"FalseISNULL為空0ISNULLFalseISNOTNULL不為空0ISNOTNULLTrue邏輯運算符位運算符|或&與<<左移位>>右移位~非(單目運算,按位取反)注釋:mysql存儲過程可使用兩種風(fēng)格的注釋雙橫杠:--該風(fēng)格一般用于單行注釋c風(fēng)格:/*注釋內(nèi)容*/一般用于多行注釋 流程控制 一、 順序結(jié)構(gòu)二、 分支結(jié)構(gòu)ifcase三、 循環(huán)結(jié)構(gòu)for循環(huán)while循環(huán)loop循環(huán)repeatuntil循環(huán)注:區(qū)塊定義,常用beginend;也可以給區(qū)塊起別名,如:lable:beginendlable;可以用leavelable;跳出區(qū)塊,執(zhí)行區(qū)塊以后的代碼begin和end如同C語言中的{和}。 輸入和輸出 mysql存儲過程的參數(shù)用在存儲過程的定義,共有三種參數(shù)類型,IN,OUT,INOUTCreateprocedure|function([[IN|OUT|INOUT]參數(shù)名數(shù)據(jù)類形...])IN輸入?yún)?shù)表示該參數(shù)的值必須在調(diào)用存儲過程時指定,在存儲過程中修改該參數(shù)的值不能被返回,為默認(rèn)值OUT輸出參數(shù)該值可在存儲過程內(nèi)部被改變,并可返回INOUT輸入輸出參數(shù)調(diào)用時指定,并且可被改變和返回IN參數(shù)例子:CREATEPROCEDUREsp_demo_in_parameter(INp_inINT)BEGINSELECTp_in;--查詢輸入?yún)?shù)SETp_in=2;--修改selectp_in;--查看修改后的值END;執(zhí)行結(jié)果:mysql>set@p_in=1mysql>callsp_demo_in_parameter(@p_in)略mysql>select@p_in;略以上可以看出,p_in雖然在存儲過程中被修改,但并不影響@p_id的值OUT參數(shù)例子創(chuàng)建:mysql>CREATEPROCEDUREsp_demo_out_parameter(OUTp_outINT)BEGINSELECTp_out;/*查看輸出參數(shù)*/SETp_out=2;/*修改參數(shù)值*/SELECTp_out;/*看看有否變化*/END;執(zhí)行結(jié)果:mysql>SET@p_out=1mysql>CALLsp_demo_out_parameter(@p_out)略mysql>SELECT@p_out;略INOUT參數(shù)例子:mysql>CREATEPROCEDUREsp_demo_inout_parameter(INOUTp_inoutINT)BEGINSELECTp_inout;SETp_inout=2;SELECTp_inout;END;執(zhí)行結(jié)果:set@p_inout=1callsp_demo_inout_parameter(@p_inout)//略select@p_inout;略附:函數(shù)庫mysql存儲過程基本函數(shù)包括:字符串類型,數(shù)值類型,日期類型一、字符串類CHARSET(str)〃返回字串字符集CONCAT(string2[,...])//連接字串INSTR(string,substring)//返回substring首次在string中出現(xiàn)的位置,不存在返回0LCASE(string2)//轉(zhuǎn)換成小寫LEFT(string2,length)//從string2中的左邊起取length個字符LENGTH(string)//string長度LOAD_FILE(file_name)//從文件讀取內(nèi)容LOCATE(substring,string[,start_position])同INSTR,但可指定開始位置LPAD(string2,length,pad)//重復(fù)用pad加在string開頭,直到字串長度為lengthLTRIM(string2)//去除前端空格REPEAT(string2,count)//重復(fù)count次REPLACE(str,search_str,replace_str)//在str中用replace_str替換search_strRPAD(string2,length,pad)//在str后用pad補充,直到長度為lengthRTRIM(string2)//去除后端空格STRCMP(string1,string2)//逐字符比較兩字串大小,SUBSTRING(str,position[,length])//從str的position開始,取length個字符,注:mysql中處理字符串時,默認(rèn)第一個字符下標(biāo)為1,即參數(shù)position必須大于等于1mysql>selectsubstring('abcd',0,2);TOC\o"1-5"\h\z+ +|substring(’abcd’,0,2)|+ +| |+ +1rowinset(0.00sec)mysql>selectsubstring('abcd',1,2);+ +|substring(’abcd’,1,2)|+ +|ab |+ +1rowinset(0.02sec)TRIM([[BOTH|LEADING|TRAILING][padding]FROM]string2)//去除指定位置的指定字符UCASE(string2)//轉(zhuǎn)換成大寫RIGHT(string2,length)//取string2最后length個字符SPACE(count)//生成count個空格二、數(shù)值類型ABS(number2)〃絕對值BIN(decimal_number)//十進制轉(zhuǎn)二進制CEILING(number2)//向上取整CONV(number2,from_base,to_base)//進制轉(zhuǎn)換FLOOR(number2)//向下取整FORMAT(number,decimal_places)//保留小數(shù)位數(shù)HEX(DecimalNumber)//轉(zhuǎn)十六進制注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX(’DEF’)返回4142143也可以傳入十進制整數(shù),返回其十六進制編碼,如HEX(25)返回19LEAST(number,number2[,..])//求最小值MOD(numerator,denominator)//求余POWER(number,power)//求指數(shù)RAND([seed])〃隨機數(shù)ROUND(number[,decimals])//四舍五入,decimals為小數(shù)位數(shù)]注:返回類型并非均為整數(shù),如:默認(rèn)變?yōu)檎沃祄ysql>selectround(1.23);TOC\o"1-5"\h\z+ +|round(1.23)|+ +| 1|+ +1rowinset(0.00sec)mysql>selectround(1.56);+ +|round(1.56)|+ +| 2|+ +1rowinset(0.00sec)可以設(shè)定小數(shù)位數(shù),返回浮點型數(shù)據(jù)mysql>selectround(1.567,2);+ +|round(1.567,2)|+ +I1.57|+ -+1rowinset(0.00sec)SIGN(number2)〃返回符號,正負(fù)或0SQRT(number2)〃開平方三、日期類型ADDTIME(date2,time_interval)//將time_interval加到date2CONVERT_TZ(datetime2,fromTZ,toTZ)//轉(zhuǎn)換時區(qū)CURRENT_DATE()〃當(dāng)前日期CURRENT_TIME()〃當(dāng)前時間CURRENT_TIMESTAMP()//當(dāng)前時間戳DATE(datetime)//返回datetime的日期部分DATE_ADD(date2,INTERVALd_valued_type)//在date2中加上日期或時間DATE_FORMAT(datetime,FormatCodes)//使用formatcodes格式顯示datetimeDATE_SUB(date2,INTERVALd_valued_type)//在date2上減去一個時間DATEDIFF(date1,date2)//兩個日期差DAY(date)〃返回日期的天DAYNAME(date)〃英文星期DAYOFWEEK(date)//星期(1-7),1為星期天DAYOFYEAR(date)//一年中的第幾天EXTRACT(interval_nameFROMdate)//從date中提取日期的指定部分MAKEDATE(year,day)//給出年及年中的第幾天,生成日期串MAKETIME(hour,minute,second)//生成時間串MONTHNAME(date)//英文月份名NOW()〃當(dāng)前時間SEC_TO_TIME(seconds)//秒數(shù)轉(zhuǎn)成時間STR_TO_DATE(string,format)//字串轉(zhuǎn)成時間,以format格式顯示TIMEDIFF(datetime1,datetime2)//兩個時間差TIME_TO_SEC(time)//時間轉(zhuǎn)秒數(shù)]WEEK(date_time[,start_of_week])//第幾周YEAR(datetime)//年份DAYOFMONTH(datetime)//月的第幾天HOUR(datetime)〃小時LAST_DAY(date)//date的月的最后日期MICROSECOND(datetime)//微秒MONTH(datetime)//月MINUTE(datetime)//分注:可用在INTERVAL中的類型:DAY,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR,HOUR_MINUTE,HOUR_SECOND,MINUTE,MINUTE_SECOND,MONTH,SECOND,YEARDECLAREvariable_name[,variable_name...]datatype[DEFAULTvalue];其中,datatype為mysql的數(shù)據(jù)類型,如:INT,FLOAT,DATE,VARCHAR(length)例:DECLAREl_intINTunsigneddefault4000000;DECLAREl_numericNUMERIC(8,2)DEFAULT9.95;DECLAREl_dateDATEDEFAULT'1999-12-31';DECLAREl_datetimeDATETIMEDEFAULT'1999-12-3123:59:59';DECLAREl_varcharVARCHAR(255)DEFAULT'Thiswillnotbepadded';SQLServer版語法為了方便說明,數(shù)據(jù)庫使用SQLServer的示例數(shù)據(jù)庫,Northwind和pubs,如果SQLServer中沒有的話,可以按下面的方法安裝1,下載SQL2000SampleDb.msi,下載地址是:/downloads/details.aspx7FamilyIdF6616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en2,安裝后,到默認(rèn)目錄C:\SQLServer2000SampleDatabases有instnwnd.sql,instpubs.sql兩個文件3,在sqlserver中運行這兩個sql就可以創(chuàng)建你Northwind和pubs數(shù)據(jù)庫。下面開始學(xué)T-SQL的語法一?注釋--單行注釋,從這到本行結(jié)束為注釋,類似C++,c#中〃/*...*/多行注釋,類似C++,C#中/*...*/變量(int,smallint,tinyint,decimal,float,real,money,smallmoney,text,image,char,varchar。。。。。。)語法:DECLARE({@local_variabledata_type}}[,...n]例如:declare@IDint--申明一個名為@ID的變量,類型為int型在SQLServer窗口中打印出變量的值語法:PRINT'anyASCIItext'|@local_variable|@@FUNCTION|string_expr變量賦值例如:--從數(shù)據(jù)表中取出第一行數(shù)據(jù)的ID,賦值給變量@id,然后打印出來Declare@IDintSet@ID=(selecttop(1)categoryIDfromcategories)Print@ID在SQL中,我們不能像代碼那樣直接給變量賦值,例如@id=1,如果要達到這樣的功能,可以這樣寫:Declare@IDintSet@ID=(select1)--類似@ID=1Select@id=1--類似@ID=1Print@ID變量運算(+,-,*,/,……)以下必要時候省略變量申明Set@ID=(select1+5)--類似@ID=1+5Set@ID=(select1-@ID)--類似@ID=1-@ID比較操作符?>(greaterthan).?<(lessthan).?=(equals).?<=(lessthanorequalto).?>=(greaterthanorequalto).?!=(notequalto).?<>(notequalto).?!<(notlessthan).?!>(notgreaterthan).沒什么說的語句塊:Begin...end將多條語句作為一個塊,類似與C++,C#中的{}例如:BeginSet@ID1=(select1)Set@ID2=(select2)EndIf,if...else...語法:IFBoolean_expression(sql_statement|statement_block}[ELSE(sql_statement|statement_block}]例如:If@idisnotnullPrint‘@idisnotnullif@ID=1beginSet@ID=(select1+1)endelsebeginset@ID=(select1+2)end上面的例子用到了比較操作符,語句塊,和IF的語法。執(zhí)行其他存儲過程EXEC例如EXECdbo.[SalesbyYear]@Beginning_Date='1/01/90',@Ending_Date='1/01/08'十.事務(wù)語法:BEGINTRAN[SACTION][transaction_name|@tran_name_variable]例如BEGINTRAN--做某些操作,例如Insertinto...if@@error<>0BEGINROLLBACKTRANENDelseBEGINCOMMITTRANEND十一.游標(biāo)我們可以在存儲過程中用Select語句取出每一行數(shù)據(jù)進行操作,這就需要用到游標(biāo)。語法:DECLAREcursor_nameCURSOR[LOCAL|GLOBAL][FORWARD_ONLY|SCROLL][STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|SCROLL_LOCKS|OPTIMISTIC][TYPE_WARNING]FORselect_statement[FORUPDATE[OFcolumn_name[,…n]]]例如:DECLARE@au_idvarchar(11),@au_fnamevarchar(20)一申明變量--申明一個游標(biāo)DECLAREauthors_cursorCURSORFORSELECTau_id,au_fnameFROMauthors--打開游標(biāo)OPENauthors_cursor--取出值FETCHNEXTFROMauthors_cursorINTO@au_id,@au_fname--循環(huán)取出游標(biāo)的值WHILE@@FETCH_STATUS=0BEGINPrint@au_idPrint@au_fnamePrint''FETCHNEXTFROMauthors_cursorINTO@au_id,@au_fnameENDCLOSEauthors_cursor-關(guān)閉游標(biāo)DEALLOCATEauthors_cursor--釋放游標(biāo)我覺得上面的是存儲過程常用的一些東東,如果要更深入的了解,更詳細(xì)的幫助,請參考SQLServer的幫助文檔例子:我自己做了一個,沒有問題,你可以看一下useNorthwindgocreateproctest@StartOrderIDint,@EndOrderIDint,@Codevarchar(1000)OutAsBeginDeclare@tmpintSet@Code=''Declare#cur_orderscursorforSelectOrderIDFromOrderswhereOrderID>=@startOrderID andOrderID<=@EndOrderIDforreadonlyOpen#cur_Ordersfetchnextfrom#cur_ordersinto@tmpwhile@@fetch_Status=0BeginSet@Code=@Code+'-'+convert(varchar(8),@tmp)fetchnextfrom#cur_ordersinto@tmpEndclose#cur_OrdersDeallocate#cur_OrdersreturnEndgo續(xù)2Stringret=null;try{Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");Stringurl="jdbc:microsoft:sqlserver://02:1433;DatabaseName=Northwind";Stringuser="sa";String password="";Connectionconn=DriverManager.getConnection(url,user,password);CallableStatementstmt=conn.prepareCall("exectest?,?,?");stmt.setInt(1,10248);stmt.setInt(2,10284);stmt.registerOutParameter(3,Types.VARCHAR);stmt.setString(3,ret);stmt.execute();System.out.println(stmt.getString(3));stmt.close();stmt=null;conn.close();}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}上面的例子沒有問題,針對你的情況,我又寫了一個,應(yīng)該可以解決你現(xiàn)在的問題--新建一個表CreatetabletmpOrders(OrderIDint,CustomerIDnchar(5))--把Orders里的OrderID列全部插入,這樣Orders與tmpOrders之間就是1:1關(guān)系了insertintotmpOrdersSelectdistinctorderID,'tmp'fromOrderscreateproctest@StartOrderIDint,@EndOrderIDint,@Codevarchar(1000)OutAsBeginDeclare@newOrderIDintDeclare@newCustomerIDnchar(5)Declare@DummyIntintDeclare@DummyCharnchar(5)Set@Code=''/*1:1temptable/formaltableissynchronizedtmpOrders<--->OrdersfetchfromOrders,updatetmpOrders*/--fortemptableDeclare#cur_tmpOrdersCursorforselectOrderID,CustomerIDFromtmpOrderswhereOrderID>=@startOrderIDandOrderID<=@EndOrderIDforupdate--forformaltableDeclare#cur_orderscursorforSelectOrderID,CustomerIDFromOrderswhereOrderID>=@startOrderIDandOrderID<=@EndOrderIDforreadonlyOpen#cur_OrdersOpen#cur_tmpOrdersfetchnextfrom#cur_tmpOrdersinto@DummyInt,@dummyChar--Importan

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論