資料庫中自定義儲存函式詳解
MySQL資料庫中有很多已經存在的函式,比如count、sun、min、max和avg等等,除了這些,我們還可以自定義自己所需要的儲存函式,其建立儲存函式的基本形式如下:
CREATE FUNCTION func_name ([func_parameter[,...]]) RETURNS type
characteristic
routine_body
說明:func_name引數是儲存函式的名稱;
func_parameter表示儲存函式的引數列表;func_parameter可以由多個引數組成,其中每個引數由引數名稱和引數型別組成,其形式為“param_name type” (param_name引數名稱;type指定引數型別,該型別可以是MySQL資料庫的任意資料型別)。
type指定儲存函式返回值的型別;
characteristic引數指定函式的特性,儲存函式只支援DETERMINISTIC(沒有NOT DETERMINISTIC)、NO SQL 和 READS SQL DATA :
DETERMINISTIC:指明儲存函式的執行結果是確定的。
NO SQL:表示子程式中不包含SQL語句;
READS SQL DATA:表示子程式中包含讀資料的語句;注意:如果開啟了bin-log,就必須為儲存函式指定相應的特性;
routine_body為函式體,以BEGIN開始END結束。函式體可以是SELECT SQL語句(不包括UPDATE、INSERT、DELETE以及建立表的SQL語句),也可以嵌入呼叫儲存過程的程式碼,還可以是其它程式碼(參見部落格:《》)。
下面以示例的方式給大家演示如何建立儲存函式:
示例一——查詢表結構中資料:
建立表結構及其資料:
建立儲存函式:CREATE TABLE `answer` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `content` VARCHAR(100) NOT NULL COMMENT '回覆內容', `create_time` DATETIME NOT NULL COMMENT '建立時間', PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='回覆表'; insert into `answer`(`id`,`content`,`create_time`) values (1,'回覆內容','2016-04-02 11:06:44');
DELIMITER &&
CREATE FUNCTION answer_content (answer_id INT(11)) RETURNS VARCHAR(100)
READS SQL DATA /*也可以為DETERMINISTIC*/
BEGIN
RETURN (SELECT content FROM answer WHERE id= answer_id );
END&&
DELIMITER;
說明:
answer_content為儲存函式的名稱;該函式的引數為answer_id;返回值是VARCHAR型別。
呼叫儲存函式:
SELECT answer_content (1);
示例二——儲存函式調內部函式:建立函式:
DELIMITER &&
CREATE FUNCTION curr_date () RETURNS DATETIME
READS SQL DATA
BEGIN
RETURN (SELECT NOW());
END&&
DELIMITER ;
呼叫函式:SELECT curr_date () ;
示例三——儲存函式呼叫儲存過程:建立儲存過程:
建立儲存函式:DELIMITER // CREATE PROCEDURE sex_name (IN sex_type INT, OUT sex_name VARCHAR(4)) NO SQL BEGIN IF (sex_type = 0) THEN SET sex_name = '女'; ELSEIF (sex_type = 1) THEN SET sex_name = '男'; ELSE SET sex_name = '其它'; END IF; END // DELIMITER ;
DELIMITER &&
CREATE FUNCTION sex_name_from_proc (sex_type INT ) RETURNS VARCHAR(4)
NO SQL
BEGIN
DECLARE sex_name VARCHAR(4);
CALL sex_name (sex_type, sex_name );
RETURN (sex_name );
END&&
DELIMITER ;
呼叫儲存函式:SELECT sex_name_from_proc (0);
儲存函式與儲存過程的區別
1、儲存過程中的routine_body可以是UPDATE、INSERT、DELETE以及建立表的SQL語句,儲存函式則不行;2、儲存過程引數列表需要指定引數的輸入輸出型別,否則預設為輸入型別,而儲存函式引數列表不區分輸入引數輸出型別(實質均為IN型別但是不允許顯式地指出);
3、不能在 MySQL儲存過程中使用return返回資料,儲存過程中返回資料需要在引數列表中定義相應的變數並且使用out或inout修飾,儲存函式返回資料只能使用return(即return關鍵字不能用在儲存過程中)。
4、儲存過程使用call關鍵字呼叫,儲存函式可以在SQL語句內部呼叫;
5、儲存過程可以返回結果集,儲存函式不能返回結果集;
相關推薦
資料庫中自定義儲存函式詳解
MySQL資料庫中有很多已經存在的函式,比如count、sun、min、max和avg等等,除了這些,我們還可以自定義自己所需要的儲存函式,其建立儲存函式的基本形式如下:CREATE FUNCTION func_name ([func_parameter[,.
在ubuntu16.04中安裝apache2+modsecurity以及自定義WAF規則詳解
一、Modsecurity規則語法示例 SecRule是ModSecurity主要的指令,用於建立安全規則。其基本語法如下: SecRule VARIABLES OPERATOR [ACTIONS] VARIABLES 代表HTTP包中的標識項,規定了安全規則針對的物件。常見的
Android中View自定義XML屬性詳解以及R.attr與R.styleable的區別
為View新增自定義XML屬性 Android中的各種Widget都提供了很多XML屬性,我們可以利用這些XML屬性在layout檔案中為Widget的屬性賦值。 如下所示: <TextView android:layout_wi
自定義控件詳解(七):drawText()
字體 相對 awt 除了 4條 nbsp pan ase span 比較基礎的一個方法。即繪制文本 使用如下: Paint paint = new Paint(); paint.setColor(Color.RED); // 紅色字體 paint.setS
自定義轉場詳解(一)
assign pda 好的 led hint ext hid case delegate 前言 本文是我學習了onevcat的這篇轉場入門做的一點筆記。 今天我們來實現一個簡單的自定義轉場,我們先來看看這篇文章將要實現的一個效果圖吧: 過程詳解 熱身準備 我們先創建一
Java Web自定義MVC框架詳解
分享一個大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 最近給學生講Java Web,希望他們能夠在學完這部分內容後自己實現一個MVC框架。但是突然發現百度上能搜尋到的靠譜的資料並不是很多,有些只是原理沒有程式碼實現,有些有程式碼實現但是
pyhanlp 停用詞與使用者自定義詞典功能詳解
hanlp的詞典模式 之前我們看了hanlp的詞性標註,現在我們就要使用自定義詞典與停用詞功能了,首先關於HanLP的詞性標註方式具體請看HanLP詞性標註集。 其核心詞典形式如下: 自定義詞典 自定義詞典有多種新增模式,首先是展示的一個小例子,展示了詞彙的動態增加與強行插入,
JVM堆記憶體管理與自定義分配引數詳解
堆記憶體模型: 在Java中,堆被劃分成兩個不同的區域:新生代(Young),老年代(Old)。而Permanent屬於永久代(方法區),不屬於堆記憶體。新生代又被分為了三個區域:Eden,from survivor,to survivor。這樣劃分的目的
自定義LayoutManager的詳解及其使用
RecyclerView不斷的普及,越來越多的人使用來代替傳統的ListView,GridView等,為了跟進時代也要不斷的學習RecyclerView的相關知識,下面就來了解一下RecyclerView的LayoutManger。 Recycler RecyclerView內部有一個R
《Android群英傳》學習筆記之Android控制元件架構與自定義控制元件詳解
一、Android控制元件架構: 控制元件大致分為兩類:ViewGroup控制元件與View控制元件。View是繪製在螢幕上的使用者能與之互動的一個物件。而ViewGroup則是一個用於存放其他Vi
mxnet中自定義損失函式和評估標準
mxnet中使用MakeLoss自定義損失函式 mxnet.symbol.MakeLoss(data=None, grad_scale=_Null, valid_thresh=_Null, normalization=_Null, name=None, a
Android自定義主題樣式詳解(結合自定義title欄講解)
此篇部落格將總結主題樣式的自定義並且結合例項自定義title欄進行講解。為了方便閱讀,在此先寫明文章結構: 1.對android主題樣式的理解 (簡略結合系統自帶樣式的講解) 2.如何自定義主題樣式 (主要,有例子) 3.如何自定義titl
linux中fork()函式詳解(原創!!例項講解)
所以打印出結果: 0 parent 2043 3224 3225 0 child 3224 3225 0 第二步:假設父程序p3224先執行,當進入下一個迴圈時,i=1,接著執行fork,系統中又新增一個程序p3226,對於此時的父程序,p2043->p3224(當前程
java中Object類的函式詳解
1.clone方法(淺拷貝) 保護方法,實現物件的淺複製,只有實現了Cloneable接口才可以呼叫該方法,否則丟擲CloneNotSupportedException異常。 主要是JAVA裡除了8種基本型別傳引數是值傳遞,其他的類物件傳引數都是引用傳遞,我們有時候不希望在方法裡講引數改變,
杜鵬的個人部落格 Flex使用Blazeds與Java互動及自定義物件轉換詳解
一、建立Flex與Java互動的工程。 本文中講到的互動是利用Blazeds的,因為這個是免費的,呵呵,我是窮人。 首先就是去下載Blazeds的壓縮包,這個可以從官網或者CSDN、JavaEye上下到。解壓縮這個包,將裡面的Blazeds.war解壓,後面建立工程時要使用。 在MyEclips
pytorch中自定義損失函式
在使用深度學習中,大家有各種各樣的訓練任務,torch.optim中存在的優化演算法難免不能滿足大家的需求,此時就需要自定義損失函數了,可參考如下過程: import torch.nn as nn class DiceLoss(nn.Module): def __init__(self
C++中get和getline函式詳解
get函式函式原型有多個,其中比較簡單的2個是:char get(); istream &get(char c);前者提取的字元作為函式值,後者提取的字元賦值給引數c,使用get函式從鍵盤提取自負的格式分別為:cin.get(); cin.get(字元變數c);#in
CUBLAS中的矩陣乘法函式詳解
關於cuBLAS庫中矩陣乘法相關的函式及其輸入輸出進行詳細討論。▶ 漲姿勢:● cuBLAS中能用於運算矩陣乘法的函式有4個,分別是 cublasSgemm(單精度實數)、cublasDgemm(雙精度實數)、cublasCgemm(單精度複數)、cublasZgemm(雙精
Lua中日期和時間函式詳解
最近在做Lua指令碼的時候,用到了Lua的日期和時間函式,發現其功能強大,學習一下!在Lua中,函式time和data提供了所有的日期和時間的功能,下面將這兩個函式分開學習。 time函式: 如果不帶任何引數呼叫time,它會返回一個數字,表示當前的日期和時間,改數字為
Java自定義註解Annotation詳解
一:簡介 開發中經常使用到註解,在專案中也偶爾會見到過自定義註解,今天就來探討一下這個註解是什麼鬼,以及註解的應用場景和如何自定義註解。 下面列舉開發中常見的註解 @Override:用於標識該方法繼承自超類, 當父類的方法被刪除或修改了,編譯器會提示錯