MYSQL网站制作之MySQL5.0新特征教程 存储历程:第三讲
关于这个理由我把它放在最后一位。在很多业界专家中有一个相当一致的观点:MySQL不能很好的扩展。关于这点可能有很大的分歧,争论的焦点主要集中于水平可扩展性和垂直可扩展性上。MySQL则更倾向于垂直可扩展性。<pstyle="TEXT-INDENT:2em">TheNewSQLStatements新SQL语句<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">Variables变量<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 在复合语句中声明变量的指令是DECLARE。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> (1)ExamplewithtwoDECLAREstatements<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 两个DECLARE语句的例子<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">WHILE...ENDWHILECREATEPROCEDUREp8()BEGINDECLAREaINT;DECLAREbINT;SETa=5;SETb=5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 在过程当中界说的变量并非真实的界说,你只是在BEGIN/END块内界说了罢了(译注:也就是形参)。<pstyle="TEXT-INDENT:2em"> 注重这些变量和会话变量纷歧样,不克不及利用润色符@你必需分明的在BEGIN/END块中声明变量和它们的范例。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 变量一旦声明,你就可以在任何能利用会话变量、笔墨、列名的中央利用。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> (2)ExamplewithnoDEFAULTclauseandSETstatement<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 没有默许子句和设定语句的例子<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 有良多初始化变量的办法。假如没有默许的子句,那末变量的初始值为NULL。你能够在任什么时候候利用SET语句给变量赋值。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> (3)ExamplewithDEFAULTclause<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 含有DEFAULT子句的例子<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//<pstyle="TEXT-INDENT:2em"> 我们在这里做了一些改动,可是了局仍是一样的。在这里利用了DEFAULT子句来设定初始值,这就不必要把DECLARE和SET语句的完成分隔了。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> (4)ExampleofCALL<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 挪用的例子<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 了局显现了历程能一般事情<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> (5)Scope<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 感化域<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp11()BEGINDECLAREx1CHAR(5)DEFAULTouter;BEGINDECLAREx1CHAR(5)DEFAULTinner;SELECTx1;END;SELECTx1;END;//如今我们来会商一下感化域的成绩。例子中有嵌套的BEGIN/END块,固然这是正当的。同时包括两个变量,名字都是x1,如许也是正当的。外部的变量在其感化域内享有更高的优先权。当实行到END语句时,外部变量消散,此时已在其感化域外,变量不再可见了,因而在存储历程外不再能找到这个声了然的变量,可是你能够经由过程OUT参数大概将其值指派给会话变量来保留其值。
<pstyle="TEXT-INDENT:2em">
<pstyle="TEXT-INDENT:2em"> 挪用感化域例子的历程:<pstyle="TEXT-INDENT:2em">mysql>CALLp11()//+-------+|x1|+-------+|inner|+-------++-------+|x1|+-------+|outer|+-------+<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 我们看到的了局时第一个SELECT语句检索到最内层的变量,第二个检索到第二层的变量<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">ConditionsandIF-THEN-ELSE前提式和IF-THEN-ELSE<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 1.<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 如今我们能够写一些包括前提式的例子:<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp12(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;IFvariable1=0THENINSERTINTOtVALUES(17);ENDIF;IFparameter1=0THENUPDATEtSETs1=s1+1;ELSEUPDATEtSETs1=s1+2;ENDIF;END;//<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 这里是一个包括IF语句的历程。内里有两个IF语句,一个是IF语句ENDIF,另外一个是IF语句ELSE语句ENDIF。我们能够在这里利用庞大的历程,但我会只管使其复杂让你能更简单弄分明。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 2.<pstyle="TEXT-INDENT:2em">CALLp12(0)//<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 我们挪用这个历程,传进值为0,如许parameter1的值将为0。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 3.<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp12(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;<--IFvariable1=0THENINSERTINTOtVALUES(17);ENDIF;IFparameter1=0THENUPDATEtSETs1=s1+1;ELSEUPDATEtSETs1=s1+2;ENDIF;END;//<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 这里变量variable1被赋值为parameter1加1的值,以是实行后变量variable1为1。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 4.<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp12(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;IFvariable1=0THEN<--INSERTINTOtVALUES(17);ENDIF;IFparameter1=0THENUPDATEtSETs1=s1+1;ELSEUPDATEtSETs1=s1+2;ENDIF;END;//<pstyle="TEXT-INDENT:2em"> 由于变量variable1值为1,因而前提"ifvariable1=0"为假,<pstyle="TEXT-INDENT:2em">IF<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">……<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">ENDIF<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 被跳过,没有被实行。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 5.<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp12(INparameter1INT)BEGINDECLAREvariable1INT;SETvariable1=parameter1+1;IFvariable1=0THENINSERTINTOtVALUES(17);ENDIF;IFparameter1=0THEN<--UPDATEtSETs1=s1+1;ELSEUPDATEtSETs1=s1+2;ENDIF;END;//<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 到第二个IF前提,判别了局为真,因而两头语句被实行了<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 6.<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/0<pstyle="TEXT-INDENT:2em"> 由于参数parameter1值即是0,UPDATE语句被实行。假如parameter1值为NULL,则下一条UPDATE语句将被实行如今表t中有两行,他们都包括值5,以是假如我们挪用p12,两行的值会酿成6。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 7.<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/1<pstyle="TEXT-INDENT:2em"> 了局也是我们所希冀的那样。
<pstyle="TEXT-INDENT:2em">CASE指令<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 1.<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/2<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 假如必要举行更多前提真假的判别我们可使用CASE语句。CASE语句利用和IF一样复杂。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 我们能够参考下面的例子: 2.<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/3<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 实行历程后,传进值1,如下面例子,值19被拔出到表t中。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> Question<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 成绩<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 成绩:CALLp13(NULL)//的感化是甚么?<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 另外一个:这个CALL语句做了那些举措?<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 你能够经由过程实行后察看SELECT做了甚么,也能够依据代码判别,在5秒内做出。<pstyle="TEXT-INDENT:2em"> Answer<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 谜底<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/4<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 谜底是当你挪用p13时,MySQL拔出了另外一条包括数值19的纪录。缘故原由是变量variable1的值为NULL,CASE语句的ELSE部分就被实行了。但愿这对人人成心义。假如你回覆不出来,没有成绩,我们能够持续向下走。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/5上面我们将会创立一些轮回。我们有三种尺度的轮回体例:
<pstyle="TEXT-INDENT:2em"> WHILE轮回,LOOP轮回和REPEAT轮回。另有一种非尺度的轮回体例:GOTO(译者语:最好不要用吧,用了就使流程凌乱)。<pstyle="TEXT-INDENT:2em">
<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/6<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 这是WHILE轮回的体例。我很喜好这类体例,它跟IF语句类似,因而不必要把握良多新的语法。这里的INSERT和SET语句在WHILE和ENDWHILE之间,当变量v年夜于5的时分轮回将会加入。利用<pstyle="TEXT-INDENT:2em">"SETv=0;"<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 语句使为了避免一个罕见的毛病,假如没有初始化,默许变量值为NULL,而NULL和任何值操纵了局都为NULL。<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/7<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 以上就是挪用历程p14的了局不必存眷体系前往是"onerowaffected"仍是"fiverowsaffected",由于这里的计数只对最初一个INSERT举措举行计数。<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/8<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 挪用后能够看到程序向数据库中拔出了5行。<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp9()BEGINDECLAREaINT/*thereisnoDEFAULTclause*/;DECLAREbINT/*thereisnoDEFAULTclause*/;SETa=5;/*thereisaSETstatement*/SETb=5;/*thereisaSETstatement*/INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;///*IwontCALLthis*/9<pstyle="TEXT-INDENT:2em"> 这是一个REPEAT轮回的例子,功效和后面WHILE轮回一样。区分在于它在实行后反省了局,而WHILE则是实行前反省。(译者语:大概同等于DOWHILE吧)<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//0<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 注重到UNTIL语句前面没有分号,在这里能够不写分号,固然你加上分外的分号更好。<pstyle="TEXT-INDENT:2em"> REPEAT...ENDREPEAT:calling:挪用<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//1<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 我们能够看到挪用p15历程后又拔出了5行纪录<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//2<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 以上是LOOP轮回的例子。<pstyle="TEXT-INDENT:2em"> LOOP轮回不必要初始前提,这点和WHILE轮回类似,同时它又和REPEAT轮回一样也不必要停止前提。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> LOOP...ENDLOOP:withIFandLEAVE包括IF和LEAVE的LOOP轮回<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//3<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 在轮回外部到场IF语句,在IF语句中包括LEAVE语句。这里LEAVE语句的意义是分开轮回。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> LEAVE的语法是LEAVE加轮回语句标号,关于轮回语句的标号成绩我会在前面进一步解说。<pstyle="TEXT-INDENT:2em"> LOOP...ENDLOOP:calling:挪用<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//4<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 挪用历程p16后,了局是另5行被拔出表t中。<pstyle="TEXT-INDENT:2em">Labels标号<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//5最初一个轮回例子中我利用了语句标号。如今这里有一个包括4个语句标号的历程的例子。我们能够在BEGIN、WHILE、REPEAT大概LOOP语句前利用语句标号,语句标号只能在正当的语句后面利用。因而"LEAVElabel_3"意味着分开语句标号名界说为label_3的语句或复合语句。
<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">
<pstyle="TEXT-INDENT:2em">EndLabels标号停止符<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//6<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 你也能够在语句停止时利用语句标号,和在开首时利用一样。这些标号停止符并非非常有效。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 它们是可选的。假如你必要,他们必需和入手下手界说的标号名字一样固然为了有优秀的编程习气,便利别人浏览,最好仍是利用标号停止符。<pstyle="TEXT-INDENT:2em">LEAVEandLabels跳出和标号<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//7<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 语句使程序跳出庞大的复合语句。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">ITERATE<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 迭代假如方针是ITERATE(迭代)语句的话,就必需用到LEAVE语句<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//8迭代)语句和LEAVE语句一样也是在轮回外部的轮回援用,它有点像C言语中的“Continue”,一样它能够呈现在复合语句中,援用复合语句标号,ITERATE(迭代)意义是从头入手下手复合语句。
<pstyle="TEXT-INDENT:2em">
<pstyle="TEXT-INDENT:2em"> 那我们启动并察看上面这个轮回,这是个必要迭代历程的轮回:<pstyle="TEXT-INDENT:2em">CREATEPROCEDUREp10()BEGINDECLAREa,bINTDEFAULT5;INSERTINTOtVALUES(a);SELECTs1*aFROMtWHEREs1>=b;END;//9<pstyle="TEXT-INDENT:2em">深切轮回<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)0<pstyle="TEXT-INDENT:2em"> 让这个已界说了标号的轮回运转起来。<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)1<pstyle="TEXT-INDENT:2em"> v的值酿成3,然后我们把它增添到4。<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)2<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 然后入手下手ITERATE(迭代)历程。<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)3<pstyle="TEXT-INDENT:2em"> 这里的ITERATE(迭代)让轮回又回到了轮回的头部。<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)4<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> 当v的值变成5时,程序将实行LEAVE语句<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)5<pstyle="TEXT-INDENT:2em"> LEAVE的了局就是跳出轮回,使运转指令抵达复合语句的最初一步。<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)6<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em"> MySQL的存储过程当中可使用GOTO语句。固然这不是尺度SQL语句,并且在这里创建标号的办法也和常规中的纷歧样。因为为了和其他DBMS兼容,这个语句会慢被减少,以是我们在MySQL参考手册中没有说起。<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">Grandcombination<pstyle="TEXT-INDENT:2em"><pstyle="TEXT-INDENT:2em">年夜组合<pstyle="TEXT-INDENT:2em">mysql>CALLp10()//+--------+|s1*a|+--------+|25||25|+--------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)7<pstyle="TEXT-INDENT:2em"> 下面例子中的语句包括了我们之前讲的一切语法,包含参数列表,特征参数,BEGIN/END块复合语句,变量声明,IF,WHILE,LOOP,REPEAT,LEAVE,ITERATE,GOTO。这是一个荒唐的存储历程,我不会运转它,由于内里有没有尽的轮回。可是内里的语法却非常正当。这些是新的流程把持和变量声明语句。上面我们将要打仗更多新的器材。
与其他数据库相比,MySQL易学易用。 而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的.. SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上. 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的.. 你可以简单地认为适合的就是好,不适合就是不好。 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。 光写几个SQL实在叫无知。 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
页:
[1]