huawei-字串分割,動態sql,instr,substr,迴圈for...loop
阿新 • • 發佈:2019-01-27
分割字串insert into XX(列名) values('aaa')
CREATE OR REPLACE PROCEDURE Sp_Utl_Split(
iStr VARCHAR2, --aaa~abc~df
iTab VARCHAR2, -- 表名
iCol VARCHAR2, --列名
iSign VARCHAR2 -- ~
)
AS
tStr VARCHAR2(3000);
v_pos1 NUMBER(5):=1;
v_pos2 NUMBER(5):=1;
v_time NUMBER(5):=1;
oSql VARCHAR2(3000);
tStr1 VARCHAR2(300);
BEGIN
oSql := 'TRUNCATE TABLE '||iTab;
EXECUTE IMMEDIATE oSql;
tStr := iSign||iStr||iSign;
WHILE v_pos2 <> 0 LOOP
v_pos1 := v_pos2;
v_pos2 := INSTR
tStr1 := SUBSTR(tStr, v_pos1+1, v_pos2-v_pos1-1);
IF tStr1 IS NOT NULL THEN
oSql := ' insert into '||iTab||'('||iCol||') values(';
oSql := oSql||tStr1||')';
EXECUTE IMMEDIATE oSql;
END IF;
oSql := '';
v_time := v_pos2+1;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RETURN;
END Sp_Utl_Split;
/
CREATE OR REPLACE PROCEDURE spDelCallData
(
sServiceID VARCHAR2, -- 組合引數 形式如: aaa,bbb,ccc .....
)AS
TYPE serviceGroup IS TABLE OF VARCHAR2(32) INDEX BY BINARY_INTEGER;
sServiceIDGroup serviceGroup ; --拆分陣列
groupIndex BINARY_INTEGER:=0;--陣列計數下標
serviceIndex NUMBER(4);--分隔符下標
serviceTemp VARCHAR2(32);--臨時轉換
strServiceId VARCHAR2(30000);--字串
s_split VARCHAR2(4):= ',' ;--分隔符
BEGIN
strServiceId := sServiceID ;
--拆分字串
LOOP
IF instr(strServiceId,s_split)=0 THEN--最後一個單獨處理,不再查詢分隔符D
sServiceIDGroup(groupIndex):=strServiceId ;
EXIT;
ELSE --非最後一個
serviceIndex :=instr(strServiceId,s_split);
serviceTemp :=substr(strServiceId,1,serviceIndex-1);
sServiceIDGroup(groupIndex):=serviceTemp;
strServiceId :=substr(strServiceId,serviceIndex+1,length(strServiceId));
groupIndex:=groupIndex+1;
END IF;
END LOOP;
--開始使用分隔好的字元=
FOR i IN sServiceIDGroup.FIRST.. sServiceIDGroup.LAST LOOP
delete from tCallData t where t.serviceid = serviceTemp
END LOOP;
usRetValue := 0 ;
commit;
EXCEPTION
WHEN OTHERS THEN
usRetValue := 1 ;
RETURN;
END spDelCallData;
/