青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

以優雅的方式在sqlite數據庫中創建自定義SQL函數  2008-03-20 16:30

字號: ? ?

這里說的SQL函數,是指可在SQL語句中使用的函數,如常見的 count(), sum(), avg(), min(), max() 等。?

在 sqlite 數據庫中,SQL函數被分為兩大類,一類稱作“Scalar function”,一類稱作“Aggregate function”。Scalar 和 Aggregate 實在不太清楚該怎么翻譯,而其含義,也難于用言語表達,大概屬于只可意會不可言傳的情況。通俗來說,Scalar函數基本等同于C/C++函數,而上面提到的 count(), sum() 等函數則屬于Aggregate函數。Aggregate函數不是根據參數直接得出結果,而是綜合了符合條件的所有記錄才最終計算出結果。

在 sqlite 中創建自定義SQL函數,需涉及以下接口函數:

int sqlite3_create_function(

? sqlite3 *db,

? const char *zFunctionName,

? int nArg,

? int eTextRep,

? void *pApp,

? void (*xFunc)(sqlite3_context*,int,sqlite3_value**),

? void (*xStep)(sqlite3_context*,int,sqlite3_value**),

? void (*xFinal)(sqlite3_context*)

);

void *sqlite3_user_data(sqlite3_context*);

void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);

const void *sqlite3_value_blob(sqlite3_value*);

int sqlite3_value_bytes(sqlite3_value*);

int sqlite3_value_bytes16(sqlite3_value*);

double sqlite3_value_double(sqlite3_value*);

int sqlite3_value_int(sqlite3_value*);

sqlite3_int64 sqlite3_value_int64(sqlite3_value*);

const unsigned char *sqlite3_value_text(sqlite3_value*);

const void *sqlite3_value_text16(sqlite3_value*);

const void *sqlite3_value_text16le(sqlite3_value*);

const void *sqlite3_value_text16be(sqlite3_value*);

int sqlite3_value_type(sqlite3_value*);

int sqlite3_value_numeric_type(sqlite3_value*);

void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));

void sqlite3_result_double(sqlite3_context*, double);

void sqlite3_result_error(sqlite3_context*, const char*, int);

void sqlite3_result_error16(sqlite3_context*, const void*, int);

void sqlite3_result_error_toobig(sqlite3_context*);

void sqlite3_result_error_nomem(sqlite3_context*);

void sqlite3_result_error_code(sqlite3_context*, int);

void sqlite3_result_int(sqlite3_context*, int);

void sqlite3_result_int64(sqlite3_context*, sqlite3_int64);

void sqlite3_result_null(sqlite3_context*);

void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));

void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));

void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));

void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));

void sqlite3_result_value(sqlite3_context*, sqlite3_value*);

void sqlite3_result_zeroblob(sqlite3_context*, int n);

要編寫sqlite3_create_function()所需的三個函數xFunc(), xStep(), xFinal(),不得不使用上面一堆接口函數,比較復雜的說。如果僅僅是單純的將以上函數一一對應到EF中,無疑是把復雜的工作轉稼給用戶,意義不大。(值得一提的是,在易語言的sqlite支持庫中,因為沒有找到比較優雅的解決方案,未提供創建自定義SQL函數的功能。) 通過對sqlite api進行包裝和再加工,我們在“易語言.飛揚”中提供了簡潔易用的、面向對象的、優雅的操作接口,在很大程度上簡化了創建自定義SQL函數的工作。

在“易語言.飛揚”中,要創建一個“Scalar function”,只需調用 SqliteDB.RegSQLScalarFunc(),傳入一個實現了接口 SQLScalarFunction 的對象即可:

public?interface?SQLScalarFunction

{

????public?文本?取函數名稱();

????public?整數?取參數個數();

????public?通用型,整數?執行(通用型[]?參數);

}

用戶的工作主要集中在接口方法“通用型,整數?執行(通用型[]?參數)”中(對應前面提到的xFunc),只需根據通用型數組參數計算出結果并返回即可。在這之前通過調用sqlite3_value_*系列函數獲取SQL參數,以及在這之后調用sqlite3_result_*系列函數將結果反饋到sqlite的工作,全部由類庫代勞。用戶接口非常簡潔。

在“易語言.飛揚”中,要創建一個“Aggregate function”,只需調用 SqliteDB.RegSQLAggregateFunc(),傳入一個實現了接口 SQLAggregateFunction 的對象即可:

public?interface?SQLAggregateFunction

{

????public?文本?取函數名稱();

????public?整數?取參數個數();

????public?SQLAggregateExecutor?創建執行者();

}

public?interface?SQLAggregateExecutor

{

????public?通用型,整數?單步執行(通用型[]?參數);

????public?通用型,整數?最終執行();

}

在一個Aggregate function被調用時,將自動調用“SQLAggregateFunction.創建執行者()”為該函數創建一個“執行者”對象(實現接口SQLAggregateExecutor)。為什么要創建“執行者”對象呢?因為Aggregate function是“上下文有關的”,每個函數調用都需要單獨維護各自的上下文信息。接口SQLAggregateExecutor中的方法“單步執行”“最終執行”分別對應前面提到的xStep,xFinal,聰明的您也許已經猜測到了。

“易語言.飛揚”sqlite類庫(sqlite.efn)提供的以上接口,簡潔易用、通俗易懂、面向對象、優雅大方,完全擺脫了sqlite api 的影子,是對原有接口的精心再加工,充分體現了我們“將復雜的事情簡單化”的決心。

(?注,以上涉及的類型名稱和方法名稱中英混用,也許是需要最終調整和完善的地方。)

根據以上接口,我們可以很輕松的實現自已版本的 sum() 函數——mysum():

public?class?MySum?<interfaces?=?SQLAggregateFunction>

{

????public?文本?取函數名稱()?{?返回?"mysum";?}

????public?整數?取參數個數()?{?返回?1;?}

????public?SQLAggregateExecutor?創建執行者()?{?返回?new?MySumExecutor();?}

????class?MySumExecutor?<interfaces?=?SQLAggregateExecutor>

????{

????????private?int?_sum?=?0;

????????public?通用型,整數?單步執行(通用型[]?參數)

????????{

????????????_sum?+=?參數[0];

????????}

????????public?通用型,整數?最終執行()?{?返回?(_sum,0);?}

????}

}


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美亚洲午夜视频在线观看| 亚洲一区亚洲二区| 欧美第一黄网免费网站| 久久精品国产77777蜜臀| 国产字幕视频一区二区| 美国成人毛片| 老**午夜毛片一区二区三区| 亚洲人成精品久久久久| 亚洲日本成人在线观看| 欧美日韩亚洲一区| 午夜亚洲视频| 久久国产加勒比精品无码| 国内外成人在线| 欧美阿v一级看视频| 欧美成人三级在线| 亚洲在线一区二区三区| 欧美影院视频| 亚洲精品韩国| 亚洲欧美在线免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美激情第一页xxx| 欧美另类综合| 久久精品91久久久久久再现| 久久嫩草精品久久久精品| 亚洲欧洲三级| 亚洲小说欧美另类婷婷| 黄色亚洲大片免费在线观看| 亚洲区第一页| 国产专区欧美精品| 亚洲欧洲精品成人久久奇米网| 国产精品久久久久永久免费观看 | 91久久精品国产| 夜夜嗨网站十八久久| 国产一区在线播放| 亚洲美女福利视频网站| 狠色狠色综合久久| 亚洲色图制服丝袜| 亚洲人成网在线播放| 亚洲欧美三级在线| 一区二区三区视频在线播放| 久久精品国产在热久久 | 亚洲黄色三级| 午夜在线视频观看日韩17c| 亚洲卡通欧美制服中文| 久久精品国产精品 | 亚洲午夜av在线| 免费成人性网站| 久久av最新网址| 欧美日韩午夜视频在线观看| 欧美成人中文字幕在线| 国产日韩欧美亚洲一区| 亚洲性xxxx| 亚洲少妇中出一区| 久久综合网络一区二区| 久久精品国语| 国产欧美日韩另类一区| 99综合在线| 一本色道久久综合亚洲精品婷婷 | 国产精品入口日韩视频大尺度| 免费亚洲电影在线观看| 国产一区欧美| 欧美一区二区三区四区在线观看| 午夜日韩在线观看| 国产精品国产三级国产aⅴ无密码| 亚洲精品一区二区三区福利| 亚洲精品小视频| 免费成人小视频| 亚洲第一黄色网| 91久久精品视频| 欧美激情国产日韩| 亚洲国产精品久久久久婷婷884 | 亚洲精品在线视频| 美女啪啪无遮挡免费久久网站| 免费观看成人| 亚洲国产一成人久久精品| 久久亚洲综合色一区二区三区| 老鸭窝亚洲一区二区三区| 在线欧美视频| 欧美精品一区三区| 99在线视频精品| 欧美一区二区成人| 国产一区二区三区最好精华液| 欧美资源在线观看| 欧美xx69| 亚洲午夜在线| 国产欧美日韩综合精品二区| 久久精品国产精品亚洲综合| 欧美激情久久久久| 亚洲神马久久| 国产亚洲精品资源在线26u| 久久久精品日韩| 亚洲黄色影片| 欧美一区三区二区在线观看| 韩国三级电影久久久久久| 免费av成人在线| 日韩小视频在线观看专区| 亚洲欧美日韩国产综合在线| 一区二区三区在线观看欧美| 欧美高清视频一区二区三区在线观看 | 亚洲欧美日韩精品久久久久| 国产一区91| 欧美肥婆在线| 午夜久久资源| 亚洲国产精品久久91精品| 亚洲欧美www| 在线日韩一区二区| 国产精品豆花视频| 久久久久久久一区| 洋洋av久久久久久久一区| 久久久久久夜| 亚洲性线免费观看视频成熟| 激情久久综艺| 国产精品对白刺激久久久| 久久久久久亚洲精品中文字幕| 亚洲日本免费| 噜噜噜噜噜久久久久久91| 亚洲视频免费观看| 亚洲国产电影| 国产一区二区三区在线免费观看 | 在线 亚洲欧美在线综合一区| 欧美片第1页综合| 欧美一区免费视频| 99v久久综合狠狠综合久久| 久久综合久久久| 亚洲欧美日韩网| 99香蕉国产精品偷在线观看| 黄色成人精品网站| 国产欧美在线播放| 欧美特黄一级| 欧美精品成人91久久久久久久| 欧美在线三级| 亚洲综合日本| 亚洲一区免费在线观看| 亚洲人成网站影音先锋播放| 免费观看久久久4p| 久久精品道一区二区三区| 亚洲欧美另类在线观看| 中国日韩欧美久久久久久久久| 亚洲肉体裸体xxxx137| 国内精品久久久久国产盗摄免费观看完整版 | 一区二区三区四区蜜桃| 91久久久久久久久| 欧美成人免费全部观看天天性色| 久久久久久久一区二区| 欧美资源在线| 久久国产夜色精品鲁鲁99| 欧美一区二区高清在线观看| 亚洲一区精彩视频| 亚洲欧美国产日韩中文字幕| 亚洲一区区二区| 亚洲自拍啪啪| 久久超碰97中文字幕| 久久精品国产99精品国产亚洲性色 | 亚洲三级影院| 日韩一级片网址| 亚洲婷婷在线| 午夜精品国产精品大乳美女| 午夜精品美女久久久久av福利| 亚洲综合清纯丝袜自拍| 欧美一区二区大片| 久久精品视频一| 久久字幕精品一区| 欧美电影电视剧在线观看| 亚洲国产视频一区二区| 9l国产精品久久久久麻豆| 亚洲一区二区三区欧美| 欧美一区二区免费| 久久午夜精品一区二区| 欧美精品www| 国产精品色网| 国内不卡一区二区三区| 亚洲人成人一区二区三区| 亚洲一区日韩在线| 久久久91精品国产| 欧美成在线观看| 在线午夜精品自拍| 久久精品一区蜜桃臀影院| 欧美精品系列| 国产一区二区黄| 亚洲日本成人| 欧美主播一区二区三区| 欧美凹凸一区二区三区视频| 99视频精品| 久久久久一区二区三区| 欧美视频一区二区三区四区| 国产视频亚洲精品| 日韩午夜在线观看视频| 久久国产精品久久国产精品| 欧美激情1区2区3区| 亚洲午夜高清视频| 欧美成人高清| 国产一区二区高清不卡| 夜夜精品视频| 另类春色校园亚洲| 亚洲一区三区视频在线观看| 女生裸体视频一区二区三区| 国产精品在线看| 中国亚洲黄色| 欧美激情在线免费观看| 欧美在线视频在线播放完整版免费观看|