mysql中自訂函數編程,mysql自訂函數

來源:互聯網
上載者:User

mysql中自訂函數編程,mysql自訂函數

文法:

建立:

Create function function_name(參數列表)returns返回值類型

函數體

函數名,應該合法的標識符,並且不應該與已有的關鍵字衝突。

一個函數應該屬於某個資料庫,可以使用db_name.funciton_name的形式執行當前函數所屬資料庫,否則為當前資料庫。

參數部分,由參數名和參數類型組成。

返回值類類型

函數體由多條可用的mysql語句,流程式控制制,變數聲明等語句構成。

多條語句應該使用begin end語句塊包含。

注意,一定要有return返回值語句。

刪除:

Dropfunction if existsfunction_name;

查看:

Show function status like ‘partten’

Show create functionfunction_name;

修改:

Alter functionfunction_name函數選項。

例子:

Hello world!

IF語句

IF search_conditionTHEN

statement_list   

[ELSEIF search_conditionTHENstatement_list]

...   

[ELSE statement_list]ENDIF;

CASE語句

CASE case_value   

WHEN when_valueTHENstatement_list   

[WHEN when_value THENstatement_list]

 ...   

[ELSE statement_list]

END CASE;

迴圈:

While

[begin_label:]WHILEsearch_conditionDO   

statement_list

END WHILE [end_label];

如果需要在迴圈內提前終止 while迴圈,則需要使用標籤;標籤需要成對出現。

退出迴圈

退出整個迴圈leave         相當於break

退出當前迴圈iterate         相當於 continue

通過退出的標籤決定退出哪個迴圈。

變數聲明:
文法:
DECLARE var_name[,...] type [DEFAULT value] 
這個語句被用來聲明局部變數。要給變數提供一個預設值,請包含一個DEFAULT子句。值可以被指定為一個運算式,不需要為一個常數。如果沒有DEFAULT子句,初始值為NULL。 
使用
語序使用 set 和 select into語句為變數賦值。

注意在函數內是可以使用全域變數(使用者自訂的變數的)@XXX   全域變數不用聲明 可以直接@XXX使用。

例子:擷取當前班級內,最大的學號。

參考學生表

create table join_student(

stu_id int not null auto_increment,

stu_no char(10),

class_id int not null,

stu_name varchar(10),

stu_info text,

primary key (stu_id)

);

計算新增學號

drop function if existssno;

delimiter $$             #在包含有語句塊時  可以更換語句結束符“;”  為“$$”

create function sno(c_id int)returns char(10)

begin

declare last_no char(10);    #聲明一個局部變數  用來儲存當前最大的學號, 如果沒有就為null

declare class_name char(10);

select stu_no from join_student where class_id=c_id order by stu_no desc limit 1 into last_no;

if last_no is null then      #如果為空白代表當前班級沒有學生   從1開始,獲得班級名字

   return concat ((select c_name from join_class where id=c_id into class_name),'001');     #concat() 函數的作用是連接字串。

else

   return concat(left(last_no,7),lpad(right(last_no,3) + 1, 3, '0'));

end if;

#return @last_no;

end

$$

delimiter ;

隨機獲得學生名字。

drop function if exists sname;

delimiter $$

create function sname() returns char(2)

begin

declare first_name char(16) default '趙錢孫李周吳鄭王馮陳褚衛蔣沈韓楊';

declare last_name char(10) default '甲乙丙丁戊己庚辛壬癸';

declare full_name char(2);

set full_name=concat(substring(first_name,floor(rand()*16+1), 1), substring(last_name,floor(rand()*10+1), 1));

return full_name;

end

$$

delimiter ;

========================================================================================

mysql常用內建函數

數值函數

Abs(X),絕對值abs(-10.9) = 10

Format(X,D),格式化千分位元值format(1234567.456, 2) =1,234,567.46

Ceil(X),向上取整ceil(10.1) = 11

Floor(X),向下取整floor (10.1) = 10

Round(X),四捨五入去整

Mod(M,N) M%N M MOD N 求餘 10%3=1

Pi(),獲得圓周率

Pow(M,N) M^N

Sqrt(X),算術平方根

Rand(),隨機數

TRUNCATE(X,D) 截取D位小數

時間日期函數

Now(),current_timestamp(); 當前日期時間

Current_date();當前日期

current_time();目前時間

Date(‘yyyy-mm-dd HH;ii:ss’);擷取日期部分

Time(‘yyyy-mm-dd HH;ii:ss’);擷取時間部分

Date_format(‘yyyy-mm-dd HH;ii:ss’,’%D %y %a %d %m %b %j');

Unix_timestamp();獲得unix時間戳記

From_unixtime();//從時間戳記獲得時間

字串函數

LENGTH(string )   //string長度,位元組

CHAR_LENGTH(string)    //string的字元個數

SUBSTRING(str ,position [,length ])   //從str的position開始,取length個字元

REPLACE(str ,search_str ,replace_str)   //在str中用replace_str替換search_str

INSTR(string ,substring )   //返回substring首次在string中出現的位置

CONCAT(string [,... ])   //串連字串

CHARSET(str)  //返回字串字元集

LCASE(string )  //轉換成小寫

LEFT(string ,length )   //從string2中的左邊起取length個字元

LOAD_FILE(file_name)   //從檔案讀取內容

LOCATE(substring , string [,start_position ])   //同INSTR,但可指定開始位置

LPAD(string ,length ,pad )   //重複用pad加在string開頭,直到字串長度為length

LTRIM(string )  //去除前端空格

REPEAT(string ,count )   //重複count次

RPAD(string ,length ,pad)   //在str後用pad補充,直到長度為length

RTRIM(string )   //去除後端空格

STRCMP(string1 ,string2 )   //逐字元比較兩字串大小

流程函數:

CASE WHEN [condition]THEN result[WHEN [condition]THEN result ...][ELSE result]END   多分支

IF(expr1,expr2,expr3)  雙分支。

彙總函式

Count()

Sum();

Max();

Min();

Avg();

Group_concat()

其他常用函數

Md5();

Default();





mysql自訂函數怎寫?

mysql> CREATE FUNCTION HelloWorld4()
-> RETURNS VARCHAR(20)
-> BEGIN
-> RETURN 'Hello World!';
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> select HelloWorld4() //
+---------------+
| HelloWorld4() |
+---------------+
| Hello World! |
+---------------+
1 row in set (0.00 sec)

如果你會其它資料庫的話, 那麼看看那個 SQL 預存程序編寫 參考手冊 對你會有些協助。

pan.baidu.com/...715080
 
MySQL怎測試自訂函數

不知道你的表的具體情況,我舉例說明哈:
--建立測試表
create table tb12
(id int identity(1,1) not null,
zl int null,
yf decimal(8,2) null
)
go
--添加測試資料
insert into tb12
select 80,null
union all
select 105,null
union all
select 5000,null
union all
select 6000,null
go

select * from tb12
----------------------------------
id zl yf
----------- ----------- ----------
1 80 NULL
2 105 NULL
3 5000 NULL
4 6000 NULL

(所影響的行數為 4 行)

--drop FUNCTION funShipFee
--建立計算郵費的內嵌資料表值函式funShipFee
CREATE FUNCTION funShipFee()
RETURNS TABLE
AS
RETURN (SELECT id,zl,yf=
case when zl<=100 then zl*0.3
when zl between 101 and 5000 then zl*0.15
else zl*0.12
end
FROM tb12)
--調用funShipFee將返回結果集如下:
SELECT *
FROM funShipFee()
-------------------------------------------
id zl yf
----------- ----------- ---------------
1 80 24.00
2 105 15.75
3 5000 750.00
4 6000 720.00

(所影響的行數為 4 行)


 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.