MySQL自定義函數實例

關於MySQL函數的基本內容,網上有很多的資料,僅在此整理一些有價值的sql實例,以方便自己閱讀,見例子便知內容。

1.求兩點之間的距離?

DELIMITER //
CREATE FUNCTION distance_fn(x1 DOUBLE, y1 DOUBLE, x2 DOUBLE, y2 DOUBLE)
   RETURNS DOUBLE
   BEGIN
   SET @distance = sqrt(pow(x2-x1, 2) + pow(y2-y1, 2));
   RETURN @distance;
   END;
   // 
DELIMITER ;

2.求圓的面積和周長?

DELIMITER //
CREATE FUNCTION circle_cal_fn(r DOUBLE) 
	RETURNS VARCHAR(50)
	BEGIN
		DECLARE result VARCHAR(50) DEFAULT '';
		DECLARE len DOUBLE;
		DECLARE area DOUBLE;
		SET len = 2 * pi() *r;
		SET area = pi() * pow(r, 2);
		SET len = round(len, 2);
		SET area = round(area, 2);
		SET result = concat('radius:', r, ' long:', len, ' area:', area);
		RETURN result;
	END;
//
DELIMITER ;

3.按成績分數分等級?

DELIMITER //
DROP FUNCTION IF EXISTS grade_switch;
CREATE FUNCTION grade_switch(score INT) 
RETURNS VARCHAR(30)
BEGIN
    DECLARE consult INT;
    DECLARE grade VARCHAR(30);
    IF(score >= 0) THEN
    SET consult = score div 10;
    CASE consult 
    WHEN 10 THEN
    SET grade = 'A';
	WHEN 9 THEN
	SET grade = 'A';
	WHEN 8 THEN
	SET grade = 'B';
	WHEN 7 THEN 
	SET grade = 'C';
	WHEN 6 THEN
	SET grade = 'D';
	WHEN 5 THEN
	SET grade = 'E';
	WHEN 4 THEN
	SET grade = 'E';
	WHEN 3 THEN
	SET grade = 'E';
	WHEN 2 THEN
	SET grade = 'E';
	WHEN 1 THEN
	SET grade = 'E';
	WHEN 0 THEN
	SET grade = 'E';
    ELSE 
    SET grade = 'score is error!';
    END CASE;
    ELSE
    SET grade = 'score is error!';
    END IF;
    RETURN grade;
END;
//
DELIMITER ;

4.找出三位數的水仙花數?

DELIMITER //
#分解出數字的個位,十位,百位,然後判斷其是否水仙花數
DROP FUNCTION IF EXISTS narcissus_number_fun//
CREATE FUNCTION narcissus_number_fun(num INT)
    RETURNS BOOL
    BEGIN
	DECLARE a INT;
	DECLARE b INT;
	DECLARE c INT;
	SET a = num div 100;
	SET b = num % 100 div 10;
	SET c = num % 100 % 10;
	IF(num = (pow(a,3) + pow(b,3) + pow(c,3))) THEN
	RETURN TRUE;
	ELSE RETURN FALSE;
	END IF;
    END;
    //
	
#獲取m~n之間的水仙花數,並且返回字符串如:between 101 and 999 narcissus is:153, 370, 371, 407,
DROP FUNCTION IF EXISTS find_narcissus_number_fun//
CREATE FUNCTION find_narcissus_number_fun(m INT, n INT) 
RETURNS VARCHAR(100) 
BEGIN 
	DECLARE result VARCHAR(100) DEFAULT '';
    DECLARE a INT;
    DECLARE b INT;
    DECLARE c INT;
    DECLARE num INT DEFAULT 0;
    IF(m <= n && m >= 100 && m <= 999) THEN
    SET result = concat('between ', m, ' and ', n, ' narcissus is:');
    narcissus_number:LOOP
    IF(narcissus_number_fun(m)) THEN
    SET num = num + 1;
    SET result = concat(result, m, ', ');
    END IF;
    SET m = m +1;
    IF(m > n) THEN LEAVE narcissus_number;
    END IF;
    END LOOP narcissus_number;
    IF(num=0) THEN SET result = concat(result, 'not find'); 
    END IF;
    ELSE
    SET result = 'invalid data';
    END IF;
    RETURN result;
END;
//
DELIMITER ;

5.求出2-n之間的所有素數?

DELIMITER //
#判斷是否是素數
CREATE FUNCTION judge_prime(num INT) RETURNS BOOL
    BEGIN
    DECLARE i INT DEFAULT 2;
    DECLARE flag INT DEFAULT 0;
    prime:WHILE i <= floor(sqrt(num)) DO 
    IF(num % i = 0) THEN
    RETURN FALSE;
    END IF;
    SET i = i + 1;
    END WHILE prime;
    RETURN TRUE;
    END;
    //

#給定區間上限n,求出2-n	之間的所有素數,並返回結果
CREATE FUNCTION find_prime_fun(n INT) RETURNS VARCHAR(100)
    BEGIN
    DECLARE result VARCHAR(100) DEFAULT '';
    DECLARE m INT DEFAULT 2;
    IF(n >= 2) THEN 
    SET result = concat('between ', 2, ' and ', n, ' prime is: ');
    prime:WHILE m <= n DO
    IF(judge_prime(m)) THEN
    SET result = concat(result, m, ', ');
    
    END IF;
    SET m = m+1;
    END WHILE prime;
    ELSE
    SET result = 'invalid data!';
    END IF;
    RETURN result;
    END;
    //
DELIMITER ;	

6.1.求s=a+aa+aaa+...+aa...a之值,其中a是一個數字,最後一個加數有n個a。例如:2+22+222+2222+22222,此時n=5。a與n由鍵盤輸入?

DELIMITER //
#每一位的數都相同且位m,一共n位,求和
CREATE FUNCTION get_plug_fun(m INT, n INT) RETURNS INT
    BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE result INT DEFAULT 0;
    plug: WHILE(i < n) DO
    SET result = result + pow(10, i)*m;
    SET i = i + 1;
    END WHILE plug;
    RETURN result;
    END;
    //
	
	
CREATE FUNCTION get_accumulate_fun(m INT, n INT) RETURNS INT
    BEGIN 
    DECLARE i INT DEFAULT 1;
    DECLARE result INT DEFAULT 0;
    accumulate: WHILE(i <= n) DO
    SET result = result + get_plug_fun(m, i);
    SET i = i+1;
    END WHILE accumulate;
    RETURN result;
    END;
    //
DELIMITER ;	

7.阿拉伯數字轉漢字?

DELIMITER //
DROP FUNCTION IF EXISTS tohanzi//
create FUNCTION tohanzi(n_LowerMoney DECIMAL)
RETURNS VARCHAR(120)
BEGIN
 Declare v_LowerStr VARCHAR(200) ;
 Declare v_UpperPart VARCHAR(200) ;
 Declare v_UpperStr VARCHAR(200) ;
 Declare i_I int ;
 set v_LowerStr = LTRIM(RTRIM(ROUND(n_LowerMoney,2 ) ) ) ;
 set i_I = 1 ;
 set v_UpperStr = '' ;
 while ( i_I <=char_length(v_LowerStr ) ) do
 set v_UpperPart = CONCAT( case substring(v_LowerStr,char_length(v_LowerStr) - i_I + 1,1 )
 WHEN '.' THEN '元'
 WHEN '0' THEN '零'
 WHEN '1' THEN '壹'
 WHEN '2' THEN '貳'
 WHEN '3' THEN '叄'
 WHEN '4' THEN '肆'
 WHEN '5' THEN '伍'
 WHEN '6' THEN '陸'
 WHEN '7' THEN '柒'
 WHEN '8' THEN '捌'
 WHEN '9' THEN '玖'
 END,
 case i_I
 WHEN 1 THEN '分'
 WHEN 2 THEN '角'
 WHEN 3 THEN ''
 WHEN 4 THEN ''
 WHEN 5 THEN '拾'
 WHEN 6 THEN '佰'
 WHEN 7 THEN '仟'
 WHEN 8 THEN '萬'
 WHEN 9 THEN '拾'
 WHEN 10 THEN '佰'
 WHEN 11 THEN '仟'
 WHEN 12 THEN '億'
 WHEN 13 THEN '拾'
 WHEN 14 THEN '佰'
 WHEN 15 THEN '仟'
 WHEN 16 THEN '萬'
 ELSE ''
 END );
 set v_UpperStr =CONCAT( v_UpperPart , v_UpperStr) ;
 set i_I = i_I + 1 ;
 end while;
 set v_UpperStr = REPLACE(v_UpperStr,'零拾','零') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零佰','零') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零仟','零') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零零零','零') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零零','零') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零角零分','整') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零分','整') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零角','零') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零億零萬零元','億元') ;
 set v_UpperStr = REPLACE(v_UpperStr,'億零萬零元','億元') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零億零萬','億') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零萬零元','萬元') ;
 set v_UpperStr = REPLACE(v_UpperStr,'萬零元','萬元') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零億','億') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零萬','萬') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零元','元') ;
 set v_UpperStr = REPLACE(v_UpperStr,'零零','零') ;
 if ( '元' = substring(v_UpperStr,1,1)) then
 set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1));
 end if;
 if ( '零' = substring(v_UpperStr,1,1)) then
 set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)) ;
 end if;
 if ( '角' = substring(v_UpperStr,1,1)) then
 set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)) ;
 end if;
 if ( '分' = substring(v_UpperStr,1,1)) then
 set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)) ;
 end if;
 if ('整' = substring(v_UpperStr,1,1)) then
 set v_UpperStr = '零元整' ;
 end if;
 return v_UpperStr;
 END;
 //
 DELIMITER ;

8.隨機產生姓名的函數?

DELIMITER //
DROP FUNCTION IF EXISTS tohanzi//
CREATE FUNCTION CreateName()
RETURNS varchar(3)
begin
DECLARE LN VARCHAR(300);
DECLARE MN VARCHAR(500);
DECLARE FN VARCHAR(500);
DECLARE LN_N INT;
DECLARE MN_N INT;
DECLARE FN_N INT;
SET LN='李王張劉陳楊黃趙周吳徐孫朱馬胡郭林何高梁鄭羅宋謝唐韓曹許鄧蕭馮曾程蔡彭潘袁於董餘蘇葉呂魏蔣田杜丁沈姜範江傅鍾盧汪戴崔任陸廖姚方金邱夏譚韋賈鄒石熊孟秦閻薛侯雷白龍段郝孔邵史毛常萬顧賴武康賀嚴尹錢施牛洪龔';
SET MN='偉剛勇毅俊雲蓮真環雪榮愛妹霞香月鶯媛豔瑞凡佳嘉瓊勤珍貞莉桂娣葉璧才發武麗琳輪翰朗伯宏言若鳴朋斌樑棟維啓克倫翔旭鵬澤晨辰士以建家致樹炎德河哲江超浩璐婭琦晶裕華慧巧美婕馨影荔枝思心邦承樂紹功鬆善厚慶磊民友玉萍紅娥玲芬芳燕彩蘭鳳潔梅秀娟英行時泰盛雄琛鈞冠策騰楠榕風航弘峯強軍平保東文輝力明永健世廣志義興良海山仁波寧貴福生龍元全國勝學祥才發武新利清飛彬富順信子傑濤昌成康星光天達安巖中茂進林有堅和彪博誠先敬震振壯會思羣豪心邦承樂紹功鬆善厚慶磊民友裕河哲江超浩亮政謙亨奇固之輪翰朗伯宏言若鳴朋斌樑棟維啓克倫翔旭鵬澤晨辰士以建家致樹炎德行時泰盛雄琛鈞冠策騰楠榕風航弘';
SET FN='偉剛勇毅俊雲蓮真環雪榮愛妹霞香月鶯媛豔瑞凡佳嘉瓊勤珍貞莉桂娣葉璧才發武麗琳輪翰朗伯宏言若鳴朋斌樑棟維啓克倫翔旭鵬澤晨辰士以建家致樹炎德河哲江超浩璐婭琦晶裕華慧巧美婕馨影荔枝思心邦承樂紹功鬆善厚慶磊民友玉萍紅娥玲芬芳燕彩蘭鳳潔梅秀娟英行時泰盛雄琛鈞冠策騰楠榕風航弘峯強軍平保東文輝力明永健世廣志義興良海山仁波寧貴福生龍元全國勝學祥才發武新利清飛彬富順信子傑濤昌成康星光天達安巖中茂進林有堅和彪博誠先敬震振壯會思羣豪心邦承樂紹功鬆善厚慶磊民友裕河哲江超浩亮政謙亨奇固之輪翰朗伯宏言若鳴朋斌樑棟維啓克倫翔旭鵬澤晨辰士以建家致樹炎德行時泰盛雄琛鈞冠策騰楠榕風航弘';
SET LN_N=CHAR_LENGTH(LN);
SET MN_N=CHAR_LENGTH(MN);
SET FN_N=CHAR_LENGTH(FN);
return Concat(substring(LN,ceil(rand()*LN_N),1),substring(MN,ceil(rand()*MN_N),1),substring(FN,ceil(rand()*FN_N),1));
End;
//
DELIMITER ;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章