2009-12-16 99 views
1

我需要爲mySQL 5.x編寫一個聚合擴展函數(用C實現)。我瀏覽過文檔(包括瀏覽sql/udf_example.c),但沒有發現任何簡短的內容,並指出了我需要做的事情。mysql中的聚合UDF(用戶定義函數)C

這就是問題:

  1. 我有一個C結構(美孚)
  2. 我有一個C函數,它接受這些富結構的數組,執行操作,該陣列上,並且返回一倍。

    struct FooBar {char * date; 雙倍年齡; double wight; 雙薪; int eye_color; };

/*處理功能/ 雙processFooBars(結構FooBar的 foobars,常量爲size_t大小);

/* MySQL表*/ CREATE TABLE foo_bar這樣的名稱(the_date DATE,雙歲,雙重量,雙薪,INT eye_color};

我希望能夠由此創建聚合功能:(我也許使用PostgreSQL語法)

CREATE AGGREGATE FUNCTION proc_foobar RETURNS REAL的soname myshlib.so ALIAS my_wrapper_func

我然後可以在MySQL查詢從而使用它:

SELECT proc_foobar()作爲like from FROM foo_bar WHERE the_date BETWEEN'09年1月1日'和'09年12月1日'

這個查詢應該做的是從表foo_bar中獲取所有匹配記錄,將它們傳遞給我的包裝函數processFooBar,然後將從接收到的記錄中提取FooBar結構,然後將它們傳遞給執行該工作並返回值的C函數。簡單

它的使用說明(僞)代碼:

#ifdefined __cplusplus 
extern "C" { 
#endif 

    /* this is the wrapper function that mySQL calls and passes the records to */ 
    double my_wrapper_func(/*Matching rows sent by mySQL + other info .. ?*/) 
    { 
    /* create FooBar Array from received record */ 
    struct FooBar ** the_array = ExtractArrayFromRowset(/*some params*/); 
    double result = processFooBar(the_array, ARRAY_SIZE_MACRO(*the_array)); 

    /* free resources */ 
    FreeFooBarArray(the_array); 
    RETURN_DOUBLE(result); /* or similar macro to return a double in MySQL */ 
    } 

#ifdefined __cplusplus 
}; 
#endif 

任何人都可以提供一個小片段(或直接我一個片段),顯示我怎麼能寫my_wrapper_func - 或更重要的一點作爲C/C++中的擴展函數,我如何實現如上所述的編寫聚合函數所需的功能。

回答

1

不回答你關於MySQL的UDF的問題,但文章是相當不錯的:

http://www.codeproject.com/KB/database/MySQL_UDFs.aspx

+0

謝謝,我會現在就開始閱讀.. – 2009-12-16 16:23:44

+0

是一個很好的鏈接,但我發現PostgreSQL的dodumentation更多在解釋狀態變量和狀態轉換函數的使用方面有用(比mySQL文檔)。雖然我會接受你的回答。 – 2009-12-17 10:38:21

+0

很酷。我正在學習UDF。如果我找到更多信息,我會確保在這裏發佈 – Yada 2009-12-17 12:00:33

相關問題