在做项目时,经常要读取txt记录文件数据,并要求按照固定格式进行拆分,所以编写了如下的存储过程:
点击(此处)折叠或打开
- PROCEDURE Str_To_Arr(p_Source_Str IN VARCHAR2,
- p_Split_Str IN VARCHAR2,
- Errbuf OUT VARCHAR2,
- Retcode OUT VARCHAR2,
- p_Dens_Array OUT Type_Tab_Arr) IS
-
- v_Source_Str VARCHAR2(1000);
- v_Split_Str VARCHAR2(8);
- v_Count NUMBER; ----分割的个数
- v_Split_Local NUMBER; ----分割符出现的位置
- v_Pos_Local NUMBER; ----分割起始位置
- v_Tab_Arr Xxt_Gl_Load_Vat_Pkg.Type_Tab_Arr;
-
- BEGIN
- Retcode := 0;
- v_Pos_Local := 1;
- v_Count := 1;
- v_Source_Str := p_Source_Str;
- v_Split_Str := p_Split_Str;
- IF Length(v_Source_Str) = 0 THEN
- Log('判断1');
- Errbuf := '要分割的字符串为空,请输入要分割的字符串!';
- Retcode := '2';
- RETURN;
- END IF;
- IF Length(v_Split_Str) = 0 THEN
- Log('判断2');
- Errbuf := '请输入要分割的界定符!';
- Retcode := '2';
- RETURN;
- END IF;
- ---取出字符串的个数
- SELECT Length(v_Source_Str) -
- Length(REPLACE(Translate(v_Source_Str, v_Split_Str, ' '),
- ' ',
- '')) / Length(v_Split_Str)
- INTO v_Count
- FROM Dual;
- FOR i IN 1 .. v_Count LOOP
-
- SELECT Instr(v_Source_Str, v_Split_Str, v_Pos_Local + 1, 1)
- INTO v_Split_Local
- FROM Dual;
-
- IF v_Split_Local = 0 THEN
-
- v_Tab_Arr(i) := v_Source_Str;
-
- dbms_output.put_line(v_tab_arr(i));
- EXIT;
- ELSE
- IF i = 1 THEN
- v_Tab_Arr(i) := Substr(v_Source_Str,
- v_Pos_Local,
- v_Split_Local - v_Pos_Local);
- v_Pos_Local := v_Split_Local;
- Dbms_Output.Put_Line(v_Tab_Arr(i));
-
- ELSE
- v_Tab_Arr(i) := Substr(v_Source_Str,
- v_Pos_Local + Length(v_Split_Str),
- v_Split_Local -
- (v_Pos_Local + Length(v_Split_Str)));
- v_Pos_Local := v_Split_Local;
-
- --Dbms_Output.Put_Line(v_Tab_Arr(i));
- END IF;
- END IF;
- END LOOP;
- p_Dens_Array := v_Tab_Arr;
- END Str_To_Arr;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29507357/viewspace-2124552/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29507357/viewspace-2124552/