来自:mjsws > 馆藏分类
配色: 字号:
关于mysql存储函数的实例讲解
2018-07-02 | 阅:  转:  |  分享 
  
关于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语句中使用它;否则,存储的函数将减慢查询的速度。
献花(0)
+1
(本文系mjsws首藏)