bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

MySQL中怎么編寫UDF-創新互聯

MySQL中怎么編寫UDF,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站設計、成都做網站、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的白朗網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

1.什么是UDF

UDF顧名思義,就是User defined Function,用戶定義函數。我們知道,MySQL本身支持很多內建的函數,此外還可以通過創建存儲方法來定義函數。UDF為用戶提供了一種更高效的方式來創建函數。

UDF與普通函數類似,有參數,也有輸出。分為兩種類型:單次調用型和聚集函數。前者能夠針對每一行數據進行處理,后者則用于處理Group By這樣的情況。

2.為什么用UDF

既然MySQL本身提供了大量的函數,并且也支持定義函數,為什么我們還需要UDF呢?這主要基于以下幾點:

1)UDF的兼容性很好,這得益于MySQL的UDF基本上沒有變動

2)比存儲方法具有更高的執行效率,并支持聚集函數

3)相比修改代碼增加函數,更加方便簡單

當然UDF也是有缺點的,這是因為UDF也處于mysqld的內存空間中,不謹慎的內存使用很容易導致mysqld crash掉。

3.如何編寫UDF

UDF的API包括

name_init():

在執行SQL之前會被調用,主要做一些初始化的工作,比如分配后續用到的內存、初始化變量、檢查參數是否合法等。

name_deinit()

在執行完SQL后調用,大多用于內存清理等工作。init和deinit這兩個函數都是可選的

name()

UDF的主要處理函數,當為單次調用型時,可以處理每一行的數據;當為聚集函數時,則返回Group by后的聚集結果。

name_add()

在每個分組中每行調用

name_clear()

在每個分組之后調用

為了便于理解,這里給出兩種UDF類型的API調用圖:

下面將就上述幾個API進行詳細的講解:

1). name_init

原型:

my_boolname_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

UDF_INIT結構體如下:

UDF_ARGS結構體如下:

Message:用于打印錯誤信息,該指針本身提供長度為MYSQL_ERRMSG_SIZE,來存儲信息;

2).name_deinit

原型:

void name_deinit(UDF_INIT*initid)

該函數會進行一些內存釋放和清理的工作,在之前我們提到initid->ptr,我們可以在該區域·進行內存的動態分配,這里就可以直接進行內存釋放。

3).name()

原型:針對不同的返回值類型,有不同的函數原型:

當返回值為STRING類型時,參數result開辟一個buffer來存儲返回值,但不超過766字節,在length參數中存儲了字符串的長度。

每個函數原型還包括了is_null和error參數,當*is_null被設置為1時,返回值為NULL,設置*error為1,表明發生了錯誤。

4).name_add()和name_clear()

原型:

void name_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error)

void name_clear(UDF_INIT *initid, char *is_null, char *error)

對于聚合類型的UDF,name_addd和name_clear會被反復調用。

4. 兩個例子

下面將舉兩個簡單的例子,一個單次調用型函數,一個聚集類型函數,來描述寫一個UDF的過程。

1)接受一個參數,并返回該參數的值

//初始化

my_booludf_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

    if (args->arg_count != 1){             //檢查參數個數

        strcpy(message,

                "udf_intexample() can onlyaccept one argument");

        return 1;

    }

    if (args->arg_type[0] != INT_RESULT){   //檢查參數類型

        strcpy(message,

                "udf_intexample() argumenthas to be an integer");

        return 1;

    }

    return 0;

}

//清理操作

voidudf_int_deinit(UDF_INIT  *initid)

{

}

//主函數

long long udf_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

    long long num = (*(long long *)args->args[0]);   //獲取第一個參數值

    return num;

}

2)接受一個浮點數類型的參數,并對每個分組進行求和

//初始化

my_booludf_floatsum_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

    double *total = (double *) malloc (sizeof(double));

    if (total == NULL){                  //內存分配失敗

        strcpy(message,"udf_floatsum:alloc mem failed!");

        return 1;

    }

    *total = 0;

    initid->ptr = (char *)total;

    if (args->arg_count != 1){            //檢查參數個數

        strcpy(message, "too moreargs,only one!");

        return 1;

    }

    if (args->arg_type[0] != REAL_RESULT){  //檢查參數類型

        strcpy(message, "wrongtype");

        return 1;

    }

    initid->decimals = 3;         //設置返回值精度

    return 0;

}

//清理、釋放在init函數中分配的內存

voidudf_floatsum_deinit(UDF_INIT *initid)

{

    free(initid->ptr);

}

//每一行都會調用到該函數

voidudf_floatsum_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

    double* float_total;

    float_total = (double*)initid->ptr;

    if (args->args[0])

        *float_total += *(double*)args->args[0];

}

//每個分組完成后,返回結果

doubleudf_floatsum(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

    double* float_total;

    float_total = (double *)initid->ptr;

    return *float_total;

}

//在進行下一個分組前調用,設置initid->ptr指向的值為0,以便下一次分組統計

voidudf_floatsum_clear(UDF_INIT *initid, char *is_null, char *error)

{

    double *float_total;

    float_total = (double *)initid->ptr;

    *float_total = 0;

}

3) Mysql-udf-http是一個開源的UDF,可以利用HTTP協議進行REST操作。什么是REST操作呢?REST是一種web service架構風格,其實現基于HTTP協議的四種方法:POST、GET、PUT以及DELETE操作,在mysql-udf-http里分別對應的函數是http_post、http_get()、http_put()、http_delete()。

源碼:http://curl.haxx.se/download/curl-7.21.1.tar.gz

./configure–prefix={安裝目錄} –with-mysql=/usr/local/webserver/mysql/bin/mysql_config

Make&& make install

該UDF的實現原理比較簡單,主要使用libcurl庫函數來實現http協議通信,總共三百多行代碼。這里有使用和介紹http://blog.s135.com/mysql-udf-http/

有些比較有趣的功能:

例如,我們可以通過GET方法獲取微博中的個人信息,其中1821798401為用戶ID

selecthttp_get('http://api.t.sina.com.cn/statuses/user_timeline/1821798401.json?count=1&source=1561596835')

UDF具有非常高的自由度,你可以編寫你任何想要實現的功能函數,甚至可以引用MySQL內核的代碼和變量。

當然,UDF也有著局限性,如下:

a)        在mysql庫下必須有func表,并且在??skip?grant?tables開啟的情況下,UDF會被禁止;

b)        當UDF掛掉時,有可能會導致mysqld crash掉;

c)        所有的UDF的函數必須是線程安全的,如果非要用全局變量,需要加互斥,盡量在name_init中分配資源,并在name_deinit中釋放

d)        需要有insert權限

看完上述內容,你們掌握MySQL中怎么編寫UDF的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!

網頁題目:MySQL中怎么編寫UDF-創新互聯
文章源于:http://vcdvsql.cn/article46/ddgpeg.html

成都網站建設公司_創新互聯,為您提供Google、網站維護網站內鏈、微信公眾號、網站設計網站導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站制作