給Oracle添加split和splitstr函數的方法建站知識
導讀:1建站知識最近項目中有很多需要做批量操作的需求,客戶端把一組逗號分隔的ID字符串傳給數據庫,存儲過程就需要把它們分割網站seo優化網站建設公司。
最近項目中有很多需要做批量操作的需求,客戶端把一組逗號分隔的ID字符串傳給數據庫,存儲過程就需要把它們分割,然后逐個處理。 以往的處理方式有如下幾種: 1、在存儲過程內寫循環,逐個分析字符串中的ID,然后逐個處理。缺點:循環一次處理一個,如果每次判斷都很多,效率將很受影響。適合每次處理要做單獨判斷的情況。2、使用臨時表,先調用一個存儲過程將ID拆分并插入到臨時表中,然后結合臨時表可以寫SQL一次處理多筆。缺點:需要插臨時表,效率不高,數據量越大影響越嚴重。 以前的項目用的最多的還是第2中方式,畢竟方便,且效率比第1種好。 現在項目中用到了很多很多的批量操作,很多的重復代碼讓我不厭其煩。忽然想到,.Net和JS中都有split類似的函數,拆分字符串很方便,oracle中要是也有這樣的功能該多好呀。 多方查找資料發現,給oracle添加split函數是完全可以實現的,避免了插入臨時表,所以效率比上面的第2中方法效率高很多。 后來我還添加了splitstr函數,可以很方便獲取字符串中的指定節點。 有了這兩個函數,處理批量操作,真是如虎添翼,效率倍增,嘿嘿…… 好了,閑話少說,上代碼!如有不妥之處,請各位前輩博友斧正。
復制代碼 代碼如下:
/* * Oracle 創建 split 和 splitstr 函數 */ /* 創建一個表類型 */ create or replace type tabletype as table如何seo優化推廣網站 of VARCHAR2(32676) / /* 創建 split 函數 */ CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ',') RETURN tabletype PIPELINED /************************************** * Name: split * Author: Sean Zhang. * Date: 2012-09-03. * Function: 返回字符串被指定字符分割后的表類型。 * Parameters: p_list: 待分割的字符串。 p_sep: 分隔符,默認逗號,也可以指定字符或字符串。 * Example: SELECT * FROM users WHERE u_id IN (SELECT COLUMN_VALUE FROM table (split ('1,2'))) 返回u_id為1和2的兩行數據。 **************************************/ IS l_idx PLS_INTEGER; v_list VARCHAR2 (32676) := p_list; BEGIN LOOP l_idx := INSTR (v_list, p_sep); IF l_idx > 0 THEN PIPE ROW (SUBSTR (v_list, 1, l_idx - 1)); v_list := SUBSTR (v_list, l_idx + LENGTH (p_sep)); ELSE PIPE ROW (v_list); EXIT; END IF; END LOOP; END; / /* 創建 splitstr 函數 */ CREATE OR REPLACE FUNCTION splitstr (str IN CLOB, i IN NUMBER := 0, sep IN VARCHAR2 := ',' ) RETURN VARCHAR2 /************************************** * Name: splitstr * Author: Sean Zhang. * Date: 2012-09-03. * Function: 返回字符串被指定字符分割后的指定節點字符串。 * Parameters: str: 待分割的字符串。 i: 返回第幾個節點。當i為0返回str中的所有字符,當i 超過可被分割的個數時返回空。 sep: 分隔符,默認逗號,也可以指定字符或字符串。當指定的分隔符不存在于str中時返回sep中的字符。 * Example: select splitstr('abc,def', 1) as str from dual; 得到 abc select splitstr('abc,def', 3) as str from dual; 得到 空 **************************************/ IS t_i NUMBER; t_count NUMBER; t_str VARCHAR2 (4000); BEGIN IF i = 0 THEN t_str := str; ELSIF INSTR (str, sep) = 網seo優化趨勢0 THEN t_str := sep; ELSE SELECT COUNTseo網站優化 ( * ) INTO t_count FROM table (split (str, sep)); IF i <= t_count THEN SELECT str INTO t_str FROM (SELECT ROWNUM AS item, COLUMN_VALUE AS str FROM table (split (str, sep))) WHERE item = i; END IF; END IF; RETURN t_str; END; /
聲明: 本文由我的SEOUC技術文章主頁發布于:2023-05-23 ,文章給Oracle添加split和splitstr函數的方法建站知識主要講述函數,標簽,給Oracle添加split和splitstr函網站建設源碼以及服務器配置搭建相關技術文章。轉載請保留鏈接: http://www.bifwcx.com/article/web_5432.html