當前位置:首頁 » 服務存儲 » 存儲過程如果分割字元串
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程如果分割字元串

發布時間: 2022-09-19 23:45:10

⑴ 關於oracle 存儲過程 如何切割一個字元串 轉化為字元數組,然後遍歷該數組: 類似ab,12;cd,55;k,7

給你寫了個包,包體代碼如下:
CREATE OR REPLACE PACKAGE BODY Pkg_Bai IS
-- 自定義個數組類型
TYPE Typ_Str_Array IS TABLE OF VARCHAR2(200) INDEX BY BINARY_INTEGER;
PROCEDURE Prc_String_To_Array(Pv_i_String IN VARCHAR2,
Pv_i_Identifier IN VARCHAR2,
Pt_o_Array OUT Typ_Str_Array) IS

Lv_Tmpstr VARCHAR2(200);
Lv_Changed_String VARCHAR2(4000);

BEGIN

-- 初始化
Lv_Changed_String := Pv_i_String;

-- 拆分邏輯
-- 1.字元串中沒有標識符
IF Instr(Pv_i_String, Pv_i_Identifier, 1, 1) = 0 THEN
Pt_o_Array(Pt_o_Array.Count + 1) := Pv_i_String;
ELSE

-- 2.字元串中有標識符
WHILE Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) > 0 LOOP
Lv_Tmpstr := Substr(Lv_Changed_String,
1,
Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) - 1);

Pt_o_Array(Pt_o_Array.Count + 1) := Lv_Tmpstr;
Lv_Changed_String := Substr(Lv_Changed_String,
Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) + 1,
Length(Lv_Changed_String));
END LOOP;

-- 3.最有一個被拆分出來的字元串中不含標識符
IF NOT Lv_Changed_String IS NULL THEN
-- 將最後一個保存
Pt_o_Array(Pt_o_Array.Count + 1) := Lv_Changed_String;
END IF;

END IF;

EXCEPTION
WHEN OTHERS THEN
NULL;
END;

PROCEDURE Prc_Test(Pv_i_Str IN VARCHAR2) IS
--定義數組
Lt_Array Typ_Str_Array;
Ln_Count NUMBER; -- 數組元素個數
Ln_Num NUMBER;
Lv_Value VARCHAR2(30);
BEGIN

Prc_String_To_Array(Pv_i_Str, ';', Lt_Array);
-- 循環數組
FOR i IN 1 .. Lt_Array.Count LOOP
-- 獲取每個元素中數值
Ln_Num := To_Number(TRIM(Substr(Lt_Array(i), Instr(Lt_Array(i), ',', -1) + 1)));
IF Ln_Num > 20 THEN
Lv_Value := TRIM(Substr(Lt_Array(i), 1, Instr(Lt_Array(i), ',', -1) - 1));
INSERT INTO a (col_a) VALUES (lv_value);
END IF;
END LOOP;
END;

END Pkg_Bai;

調用Prc_Test來分隔字元串並按要求比較後插入a表。我測試過,沒有問題。
需要注意的是,數據的要求:字元串中每組數據間使用英文小寫分號分隔,同一組數據字母在前,數字在後,以英文小寫逗號分隔。測試一下吧。
歡迎採納,不採納你都對不起我這20分鍾。呵呵......

⑵ db2如何使用存儲過程拆分字元串

declare @inputStr varchar(max)set @inputStr='H,SH600,AAA,123,456,567,566,565,H,SH600,ABC,542,34,35,367,765,H,SH600,AAC,52,314,325,3867,7865'declare @divideFlag varchar(20)set @divideFlag='H,'declare @bnname varchar(8)declare @gpdm varchar(8)declare @gpcn intdeclare @ydate intdeclare @yopen intdeclare @yhigh intdeclare @substr varchar(200)declare @pos1 intdeclare @pos2 intdeclare @sql varchar(400)--如果字元串中有分隔符標記while CHARINDEX(@divideFlag,@inputStr,0)0begin set @pos1 = CHARINDEX(@divideFlag,@inputStr,0) print '位置1 '+cast(@pos1 as varchar) set @pos2 = CHARINDEX(@divideFlag,@inputStr,@pos1+1) print '位置2 ' + cast(@pos2 as varchar) if @pos20 begin set @substr = SUBSTRING(@inputStr,@pos1,@pos2-@pos1) print '截取處理串 '+ @substr set @inputStr = SUBSTRING(@inputStr,@pos2,len(@inputStr)) --print @inputStr end else begin set @substr = SUBSTRING(@inputStr,@pos1,len(@inputStr)) print '截取處理串 '+ @substr set @inputStr = 'empty' --print @inputStr end --去掉開頭的分割標記 set @substr=substring(@substr,CHARINDEX(@divideFlag,@substr,0)+len(@divideFlag),len(@substr)) print '去掉開頭分割標記 ' + @substr if right(@substr,1)=',' begin set @substr = left(@substr,len(@substr)-1) print '去掉末尾的逗號' + @substr end --取得表名稱 set @bnname = substring(@substr,1,charindex(',',@substr,0)-1) print @bnname --取表名稱後面的字元串 set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print @substr --取得第一個欄位 set @gpdm = substring(@substr,1,charindex(',',@substr,0)-1) print @gpdm --取得後面的字元串 set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print @substr set @gpcn = substring(@substr,1,charindex(',',@substr,0)-1) print @gpcn set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print @substr set @ydate = substring(@substr,1,charindex(',',@substr,0)-1) print @ydate set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print @substr set @yopen = substring(@substr,1,charindex(',',@substr,0)-1) print @yopen set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print @substr set @yhigh = substring(@substr,1,charindex(',',@substr,0)-1) print @yhigh set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print @substr -- 拼接 插入的 sql 字元串 set @sql = 'insert into '+@bnname+' (gpdm,gpcn,ydate,yopen,yhigh) values( '''+@gpdm+''','+cast(@gpcn as varchar)+','+cast(@ydate as varchar)+','+cast(@yopen as varchar)+','+cast(@yhigh as varchar)+' )' print @sqlend-- 拷貝到查詢分析器執行,可以看到列印出的消息,拼接的字元串應該可以用

⑶ 如何在存儲過程中分割逗號分隔的字元串

create function f_split(@SourceSql varchar(8000)) returns @temp table(a varchar(100)) as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(',',@SourceSql) while @i>=1 begin insert @temp values(left(@SourceSql,@i-1)) set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i) set @i=charindex(',',@SourceSql) end if @SourceSql<>',' insert @temp values(@SourceSql) return end 用法 select * from dbo.f_split('abcd,efg,mm')

⑷ mysql存儲過程中 如何拆分字元串

MySQL分割字元串應該如何實現呢?下面就為您介紹MySQL分割字元串的實現方法步驟,希望可以讓您對MySQL分割字元串有更多的了解。

例如:update `edw_video` set company = substring(keyword,1,length(SUBSTRING_INDEX(keyword,",",1)))

名稱:SPLIT_SUB_STR1(取得split字元串的第一段)
參數:str 要split的目標字元串 (輸入格式為『11,2,3,4,5,6』; 輸出為『2,3,4,5,6』)
delimiter 分隔符 (『,』)
split1 輸出第一項(『11』)
存儲過程
CREATE DEFINER=`root`@`%` PROCEDURE `SPLIT_SUB_STR0`(inout str VARCHAR(1000) ,delimiter VARCHAR(1), out split1 VARCHAR(20))

BEGIN
# 名稱 SPLIT_SUB_STR1 取得分割字元串的第一段字元
# 參數inout str VARCHAR(1000) ,delimiter VARCHAR(1), out split0 VARCHAR(20)
# 輸入完整字元串,輸出去掉取得第一項後的字元串; 分隔符; 輸出split的第一個項目

#分割出第一段字元串不包括分隔符的長度
DECLARE SUB_STR_LENGTH INT;

# SUBSTRING_INDEX函數取得目標字元串左側第n個分割符左側的部分,n為負時返回右側第n個的右部分
SET SUB_STR_LENGTH = length(SUBSTRING_INDEX(str,delimiter,1));

#截取第一段字元串,不包括分隔符,放入輸出參數里
SET split0 = substring(str, 1, SUB_STR_LENGTH);

# 取得去掉第一個字元串和分隔符的字元串,進行下次循環取得下個字元串
SET str = substring(str, SUB_STR_LENGTH + 2 );
#測試一下輸出是否正確
#SELECT SUB_STR_LENGTH, SUB_STR_SPLIT0, STR;
END

調用實例

CREATE DEFINER=`root`@`%` PROCEDURE `test`()
BEGIN
#目標字元串
set @a = 』1,2,3,4,5,6,12『;
# 分隔符
set @c = ',';
# 存儲風格後的字元串
set @b = '';

REPEAT
# 調用上面的存儲過程
CALL SPLIT_SUB_STR0(@a, ',', @c);
#將取得的字元串拼接,測試用
set @b = concat(@b, @c);
#當目標字元串為空時,停止循環
UNTIL @a = ''
END REPEAT;
# 查看結果
select @a, @c, @b;

END;

⑸ oracle存儲過程傳入一個字元串參數'1,2,3,4,5,6,7,8',如何分割並轉為數字

create or replace type type_split as table of varchar2(50); --創建一個type,如果為了使split函數具有通用性,請將其size 設大些。

--創建function
create or replace function split
(
p_list varchar2,
p_sep varchar2 := ','
) return type_split pipelined
is
l_idx pls_integer;
v_list varchar2(50) := 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;
return;
end split;

使用:
select * from table(split('1,2,3,4,5,6,7,8'
,','));
然後就可以通過「,」來分割數字了

⑹ SQL 存儲過程 長字元串分割存儲

declare @inputStr varchar(max)
set @inputStr='H,SH600,AAA,123,456,567,566,565,H,SH600,ABC,542,34,35,367,765,H,SH600,AAC,52,314,325,3867,7865'

declare @divideFlag varchar(20)
set @divideFlag='H,'

declare @bnname varchar(8)
declare @gpdm varchar(8)
declare @gpcn int
declare @ydate int
declare @yopen int
declare @yhigh int

declare @substr varchar(200)
declare @pos1 int
declare @pos2 int

declare @sql varchar(400)

--如果字元串中有分隔符標記
while CHARINDEX(@divideFlag,@inputStr,0)>0
begin
set @pos1 = CHARINDEX(@divideFlag,@inputStr,0)
print '位置1 '+cast(@pos1 as varchar)
set @pos2 = CHARINDEX(@divideFlag,@inputStr,@pos1+1)
print '位置2 ' + cast(@pos2 as varchar)

if @pos2>0
begin
set @substr = SUBSTRING(@inputStr,@pos1,@pos2-@pos1)
print '截取處理串 '+ @substr
set @inputStr = SUBSTRING(@inputStr,@pos2,len(@inputStr))
--print @inputStr
end
else
begin
set @substr = SUBSTRING(@inputStr,@pos1,len(@inputStr))
print '截取處理串 '+ @substr
set @inputStr = 'empty'
--print @inputStr
end
--去掉開頭的分割標記
set @substr=substring(@substr,CHARINDEX(@divideFlag,@substr,0)+len(@divideFlag),len(@substr))
print '去掉開頭分割標記 ' + @substr

if right(@substr,1)=','
begin
set @substr = left(@substr,len(@substr)-1)
print '去掉末尾的逗號' + @substr
end
--取得表名稱
set @bnname = substring(@substr,1,charindex(',',@substr,0)-1)
print @bnname
--取表名稱後面的字元串
set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr))
print @substr
--取得第一個欄位
set @gpdm = substring(@substr,1,charindex(',',@substr,0)-1)
print @gpdm
--取得後面的字元串
set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr))
print @substr

set @gpcn = substring(@substr,1,charindex(',',@substr,0)-1)
print @gpcn
set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr))
print @substr

set @ydate = substring(@substr,1,charindex(',',@substr,0)-1)
print @ydate
set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr))
print @substr

set @yopen = substring(@substr,1,charindex(',',@substr,0)-1)
print @yopen
set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr))
print @substr

set @yhigh = substring(@substr,1,charindex(',',@substr,0)-1)
print @yhigh
set @substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr))
print @substr
-- 拼接 插入的 sql 字元串
set @sql = 'insert into '+@bnname+' (gpdm,gpcn,ydate,yopen,yhigh)
values(
'''+@gpdm+''','+cast(@gpcn as varchar)+','+cast(@ydate as varchar)+','+cast(@yopen as varchar)+','+cast(@yhigh as varchar)+'
)'

print @sql
end
-- 拷貝到查詢分析器執行,可以看到列印出的消息,拼接的字元串應該可以用

⑺ 關於SQLserver 存儲過程 如何切割一個字元串 轉化為數組

Create Function [dbo].[Split](@Sql varchar(8000),@Splits varchar(10))
returns @temp Table (a varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
End

⑻ 我就是想在存儲過程當中,傳入一個字元串(不知道長度的)。然後把這個字元傳裡面的字元全部拆分開來。

給你個存儲過程

CREATE PROCEDURE p_split
@c varchar(8000),
@split varchar(5)

as
declare @t table( word varchar(20) )

begin

while(charindex(@split,@c)<>0)
begin
insert @t( word) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'') -- 刪除指定長度的字元並在指定的起始點插入另一組字元
end
insert @t(word) values (@c) ---最後一個不含分隔的加進來
select distinct * from @t
end
GO

還是用表變數

⑼ oracle裡面怎麼分割字元串

(1)定義split_type類型:
CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (4000) /

(2)定義split函數:
CREATE OR REPLACE FUNCTION split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN split_type IS j INT := 0; i INT := 1; len INT := 0; len1 INT := 0; str VARCHAR2 (4000); my_split split_type := split_type (); BEGIN len := LENGTH (p_str); len1 := LENGTH (p_delimiter); WHILE j < len LOOP j := INSTR (p_str, p_delimiter, i); IF j = 0 THEN j := len; str := SUBSTR (p_str, i); my_split.EXTEND; my_split (my_split.COUNT) := str; IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR (p_str, i, j - i); i := j + len1; my_split.EXTEND; my_split (my_split.COUNT) := str; END IF; END LOOP; RETURN my_split; END split; /

(3)存儲過程中,使用類似
For T In ( select a,b,c,d from table (split('1,2,3,4',',')) ) Loop
--注意下面的inserti語句,varchar類型的值需要補充引號上去
Execute Immediate ' insert into tableName set fieldName = '||T.a ;
Execute Immediate 'commit';
End Loop;
的查詢語句,把分開的結果拼成sql語句並寫入到表中。