1. 程式人生 > >資料庫中自定義儲存函式詳解

資料庫中自定義儲存函式詳解

        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包中的標識項,規定了安全規則針對的物件。常見的

AndroidView定義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

linuxfork()函式(原創!!例項講解)

    所以打印出結果:    0 parent 2043 3224 3225    0 child  3224 3225    0    第二步:假設父程序p3224先執行,當進入下一個迴圈時,i=1,接著執行fork,系統中又新增一個程序p3226,對於此時的父程序,p2043->p3224(當前程

javaObject類的函式

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:用於標識該方法繼承自超類, 當父類的方法被刪除或修改了,編譯器會提示錯