关于mysql存储函数的实例讲解关于mysql存储函数的实例讲解?12345678910111213#定义函数delimiter$$cre atefunctiongetGameName(gameidint)returnsVARCHAR(45)DETERMINI STICbegin?declarenameVARCHAR(45);?setname=(selectgamenamefro mcy_gamewhereid=gameid);?return(name);end$$delimiter;?select getGameName(4);#使用selectid,getGameName(4)fromcy_gamewhereid= 4;#使用存储的函数是返回单个值的特殊类型的存储程序。您使用存储的函数来封装在SQL语句或存储的程序中可重用的常用公式或业务规则。 与存储过程不同,您可以在SQL语句中使用存储的函数,也可以在表达式中使用。这有助于提高程序代码的可读性和可维护性。MySQL存储 函数语法以下说明了创建新存储函数的最简单语法:?1234CREATEFUNCTIONfunction_name(param1, param2,…)?RETURNSdatatype?[NOT]DETERMINISTIC?statementsSQL首先,在C REATEFUNCTION子句之后指定存储函数的名称。其次,列出括号内存储函数的所有参数。默认情况下,所有参数均为IN参数。不 能为参数指定IN,OUT或INOUT修饰符。第三,必须在RETURNS语句中指定返回值的数据类型。它可以是任何有效的MySQL数据 类型。第四,对于相同的输入参数,如果存储的函数返回相同的结果,这样则被认为是确定性的,否则存储的函数不是确定性的。必须决定一个存储 函数是否是确定性的。如果您声明不正确,则存储的函数可能会产生意想不到的结果,或者不使用可用的优化,从而降低性能。第五,将代码写入 存储函数的主体中。它可以是单个语句或复合语句。在主体部分中,必须至少指定一个RETURN语句。RETURN语句用于返回一个值给 调用者。每当到达RETURN语句时,存储的函数的执行将立即终止。MySQL存储函数示例我们来看一下使用存储函数的例子,这里将使用 示例数据库(yiibaidb)中的customers表进行演示。以下示例是根据信用额度返回客户级别的功能。我们使用IF语句来确定 信用额度。?123456789101112131415161718DELIMITER$$?CREATEFUNCTIONCus tomerLevel(p_creditLimitdouble)RETURNSVARCHAR(10)?DETERMINISTI CBEGIN?DECLARElvlvarchar(10);??IFp_creditLimit>50000THEN?SE Tlvl=''PLATINUM'';?ELSEIF(p_creditLimit<=50000ANDp_creditLi mit>=10000)THEN?SETlvl=''GOLD'';?ELSEIFp_creditLimit<10000 THEN?SETlvl=''SILVER'';?ENDIF;??RETURN(lvl);END$$DELIMITER; 988棋牌http://www.rodlg.comSQL现在,我们在SELECT语句中调用CustomerLevel()存储 函数,如下所示:?12345SELECT?customerName,CustomerLevel(creditLimit)FROM ?customersORDERBYcustomerName;388棋牌http://www.455573.comSQL 执行上面查询语句,得到以下结果-?123456789101112131415161718192021+------------- -----------------------+----------------------------+|customerNa me??????????????????????|CustomerLevel(creditLimit)|+--------- ---------------------------+----------------------------+|Alpha Cognac??????????????????????|PLATINUM??????????????????||Amer icanSouvenirsInc????????????|SILVER????????????????????||Am icaModels&Co.????????????????|PLATINUM??????????????????|| ANGResellers?????????????????????|SILVER????????????????????| |Anna''sDecorations,Ltd???????????|PLATINUM?????????????????? ||AntonDesigns,Ltd.???????????????|SILVER?????????????????? ??||AsianShoppingNetwork,Co????????|SILVER???????????????? ????||AsianTreasures,Inc.?????????????|SILVER?????????????? ??????||Ateliergraphique?????????????????|GOLD?????????????? ????????||AustralianCollectables,Ltd??????|PLATINUM???????? ??????????||AustralianCollectors,Co.????????|PLATINUM?????? ????????????||此处省略了一大波数据 ||VitachromeInc.???????????????????|PLATINUM???????? ??????????||VolvoModelReplicas,Co??????????|PLATINUM?????? ????????????||WarburgExchange??????????????????|SILVER?????? ??????????????||WestCoastCollectablesCo.???????|PLATINUM?? ????????????????|+------------------------------------+--------- -------------------+122rowsinsetShell下面,来重写在MySQLIF语句教程中开发的Ge tCustomerLevel()存储过程,如下所示:?1234567891011121314151617DELIMITER$$? CREATEPROCEDUREGetCustomerLevel(?INp_customerNumberINT(11),?O UTp_customerLevel?varchar(10))BEGIN?DECLAREcreditlimDOUBLE;?? SELECTcreditlimitINTOcreditlim?FROMcustomers?WHEREcustomerNu mber=p_customerNumber;??SELECTCUSTOMERLEVEL(creditlim)?INTOp _customerLevel;END$$DELIMITER;天地棋牌http://www.dadiqipaigw.cnSQL如您所见,GetCustomerLevel()存储过程在使用CustomerLevel()存储函数时可读性更高。请注意,存储函数仅返回单个值。如果没有包含INTO子句的SELECT语句,则将会收到错误。另外,如果存储的函数包含SQL语句,则不应在其他SQL语句中使用它;否则,存储的函数将减慢查询的速度。 |
|