1. 程式人生 > >mysql 通過儲存過程分割字串為陣列

mysql 通過儲存過程分割字串為陣列

分割字串為陣列需要用到 三個mysql 的函式
REVERSE(str) 返回顛倒字元順序的字串str。
SUBSTRING_INDEX(str,delim,count)
返回從字串str的第count個出現的分隔符delim之後的子串。如果count是正數,返回最後的分隔符到左邊(從左邊數) 的所有字元。如果count是負數,返回最後的分隔符到右邊的所有字元(從右邊數)。
REPLACE(str,from_str,to_str)
返回字串str,其字串from_str的所有出現由字串to_str代替。

通過三個函式的組合使用做到分割字串為陣列的功能。

首先寫兩個函式

1,獲得所有以“某個符號“分割的字串的個數,函式內容如下
(將sql程式碼複製放在navicat中執行即可)

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string_total`(
f_string varchar(1000),f_delimiter varchar(5)
) RETURNS int(11)
BEGIN
  -- Get the total number of given string.
  return 1+(length(f_string) - length(replace(f_string,f_delimiter,''
)));
END$$ DELIMITER ;

2、按分割取出字串
(將sql程式碼複製放在navicat中執行即可)

DELIMITER $$


CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string`(
f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN
  -- Get the separated number of given string.
  declare result varchar
(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1)); return result; END$$ DELIMITER ;

然後再寫一個儲存過程進行組合使用這兩個函式,輸入需要分割的字串 ,和分隔符,輸出 按某某符號分割後的陣列
(將sql程式碼複製放在navicat中執行即可)

DELIMITER $$

CREATE PROCEDURE `sp_print_result`(
 IN f_string varchar(1000),IN f_delimiter varchar(5)
)
BEGIN
  -- Get the separated string.
  declare cnt int default 0;
  declare i int default 0;
  set cnt = func_get_split_string_total(f_string,f_delimiter);
  drop table if exists tmp_print;
  create temporary table tmp_print (num int not null);
  while i < cnt
  do
    set i = i + 1;
    insert into tmp_print(num) values (func_get_split_string(f_string,f_delimiter,i));
  end while;
  select * from tmp_print;

END$$

DELIMITER ;

然後輸入字串進行測試。
call sp_print_result(“434,123,12,234,123,123”,”,”);
結果如下圖
這裡寫圖片描述

可能執行的時候會報錯:The user specified as a definer (‘root’@’%’) does not exist

解決方法如下:
執行 :grant all privileges on *.* to [email protected]"%" identified by ".";
執行 :flush privileges;
就解決了這個問題。

最後說一下儲存過程和mysql的函式
儲存過程是使用者定義的一系列sql語句的集合,涉及特定表或其它物件的任務,使用者可以呼叫儲存過程,而函式通常是資料庫已定義的方法,它接收引數並返回某種型別的值並且不涉及特定使用者表。

儲存過程和函式存在以下幾個區別:

1)一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。儲存過程,功能強大,可以執行包括修改表等一系列資料庫操作;使用者定義函式不能用於執行一組修改全域性資料庫狀態的操作。

2)對於儲存過程來說可以返回引數,如記錄集,而函式只能返回值或者表物件。函式只能返回一個變數;而儲存過程可以返回多個。儲存過程的引數可以有IN,OUT,INOUT三種類型,而函式只能有IN類~~儲存過程宣告時不需要返回型別,而函式宣告時需要描述返回型別,且函式體中必須包含一個有效的RETURN語句。

3)儲存過程,可以使用非確定函式,不允許在使用者定義函式主體中內建非確定函式。

4)儲存過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函式可以作為查詢語句的一個部分來呼叫(SELECT呼叫),由於函式可以返回一個表物件,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用儲存過程,而可以使用函式。

相關推薦

mysql 通過儲存過程分割字串陣列

分割字串為陣列需要用到 三個mysql 的函式 : REVERSE(str) 返回顛倒字元順序的字串str。 SUBSTRING_INDEX(str,delim,count) 返回從字串str的第count個出現的分隔符delim之後的子串。

sqlserver 分割字串陣列

---返回字串按照指定分隔符分割後的陣列的長度 CREATE function Get_StrArrayLength (   @str varchar(1024),  --要分割的字串   @split varchar(10)  --分隔符號 ) return

mysql儲存過程字串轉換數字

公司的需求,需要根據使用者的設定的百分比去查詢資料。當時純真的以為可以 -- set @a_value=`CONVERT`(@a_value,DOUBLE); 但是會出現錯誤,百度了一下,原來convert不支援轉化為double 只能轉換以下型別 二進位制,同帶binar

mysql通過儲存過程實現aes加解密

前言:資料庫難免會存一些敏感資料,密碼可以用不可逆演算法,但是有些東西本來就需要可逆,比如使用者銀行卡號、身份證號、手機號等,mysql自身提供了AES_ENCRYPT、AES_DECRYPT來實現aes的加解密,但是利用格式為AES_ENCRYPT('需要加密的字元','

Mysql儲存過程字串分割

今在專案中碰到了要把字串分割,記錄下來,以後可能還用的到 首先想上我的儲存過程程式碼 DELIMITER $$ USE `bplate`$$ DROP PROCEDURE IF EXISTS `lp_plate_insertplateinfo`$$ CREATE DE

儲存過程中一維陣列接受按分割符拆分的資料

declare -- Local variables here i integer; Lar_Input t_Arr.Arrname; --一維陣列接收 按分隔符拆分 begin -- Test statements here Pkg_n_Cst_String.Pr

MySQL使用儲存過程資料庫中全部的表增加備用欄位

需求描述 要為資料庫裡的所有的表統一加上十六個備用欄位,前提是備用欄位名取表名前三位,拼接上備用1-16 , 16個欄位中,其中8個varchar, 4個int, 4個datetime 1.建立一個簡單的表 DROP TABLE customer_detail_info; C

mysql儲存過程判斷不空和不空,查詢結果賦值變數

直接看例子,判斷為空是is null delimiter // create procedure proc__pre_activity_scan() begin    declare p_tid int(10);    set @p_tid=(select tid fro

MySQL 儲存過程 CONCAT 字串拼接

CREATE PROCEDURE pro_province_report (IN startDate VARCHAR(20),IN endDate VARCHAR(20),IN SourceType INT) /* 功能:根據時間,來源SourceType 統計 每

MySQL儲存過程:批量使用者授權

編寫出這些指令碼的需求是把慢查日誌寫入資料庫中,方便檢視。 1. 由於預設的mysql.slow_log表使用的是csv資料引擎,不支援對資料進行索引,所以需要將其修改為MyISAM引擎,並對query_time欄位進行索引以優化查尋效率。 2. 需要對所有的使用者進行授權

從零開始寫MySql儲存過程(四)通過儲存過程實現階乘的計算

   首先,我認為在實際的開發中,應該沒人會用儲存過程去計算階乘,但是用這個作為練習我覺得還是挺不錯的,因為通過這個儲存過程的編寫可以熟悉引數型別,儲存過程內部使用自定義變數,迴圈結構的語法的使用mysql> create procedure jiecheng(in p

創建MYSQL儲存過程

創建mysql的儲存過程 創建不帶參數的儲存過程CREATE PROCEDURE 過程名() 過程體 SELECT VERSION(); 調用儲存過程第一種CALL 過程名(); (帶有參數時使用)第二種CALL 過程名; (不帶參數時使用)

Mysql儲存過程與自定義函式的區別

建立儲存過程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristi

MySQL優化---儲存過程儲存函式-1-轉自部落格園

轉自網際網路.mysql優化   當一個大型系統在建立時,會發現,很多的SQL操作是有重疊的,個別計算是相同的,比如:業務系統中,計算一張工單的計算方式。當遇到這些情況時,我們運用儲存過程就是一個非常棒的優化啦。那麼,什麼是儲存 過程和儲存函式呢? 一、MYSQL儲存過程簡介(技術

關於MySQL資料庫儲存過程的感想

以下只是學習路上的淺薄感想,如理解有所偏差,還請有識之士指正! 一、儲存過程意義理解     關於儲存過程,我的理解是對資料庫語言進行程式設計呼叫,就像Java程式碼類程式設計寫一個具有某種特定功能的方法去進行呼叫一樣。資料庫的儲存過程是一組相關聯的sql語句或函式,通過進行組合形成模

mysql建立儲存過程,模擬插入200萬用戶

公司需要建立模擬使用者測試大資料,百度建立儲存過程模擬插入資料下面是sql程式碼 CREATE PROCEDURE test()  begin  declare var int; declare a int; declare mobile bigint; SET var

(十二)MySQL基礎——儲存過程和函式

儲存過程和函式:類似於java中的方法 好處:1、提高程式碼的重用性;2、簡化操作   儲存過程: 1、含義:一組預先編譯好的sql語句的集合,可以理解成批處理語句 2、優點:(1)提高程式碼的重用性(2)簡化操作(3)減少了編譯次數並且減少了和資料庫伺服器的連線次

MySQL儲存過程和函式入門 第一篇

最近開發中用到儲存過程和函式,就順便學習一下了。 1.什麼是儲存過程和函式?   儲存過程和函式是事先經過編譯並存儲在資料庫的一段SQL語句集合,呼叫儲存過程和函式可以減少資料庫和應用伺服器之間的傳輸,對於提高資料處理的效率是有好處的。 2.儲存過程和函式的區別 函式

Oracle與Mysql建立儲存過程

<1>Oracle如下: create or replace procedure aa //建立無參儲存過程 is begin for i in 1…100000 loop //定義迴圈 insert into jz(jz_object_id,cid,customer_id,co

mysql-使用儲存過程一次性批量建立多張表

大家好,謝謝大家閱讀我的文章,請多多指教 如何使用儲存過程一次性建立多張表,^-^,程式碼如下: 業務需求:專案中需要建立100張表 我使用了儲存過程來實現 這是我專案中使用到的一個小小功能 DELIMITER $$ USE `DBName`$$ DROP PROCEDURE