oracle中并没有截取字符串的函数,所以当我们需要提取字符串并进行截取的时候,就需要自己写一个split了。
- 首先我们需要定义一个table类型。
table()函数,这个还需要继续学习。可以自行百度。CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (500);
- 创建function。
create or replace function strsplit(p_value varchar2,p_split varchar2 := ';') return split_type pipelined is v_idx integer; v_str varchar2(500); v_strs_last varchar2(4000) := p_value; --<span style="font-family: Arial, Helvetica, sans-serif;">p_split 分隔符号 </span> begin v_strs_last := REPLACE(v_strs_last , '","' , ';');--字符串转换。 v_strs_last := substr(v_strs_last,2,lengthb(v_strs_last)-2);--去掉开头结尾的引号 。 loop v_idx := instr(v_strs_last, p_split); exit when v_idx = 0; v_str := substr(v_strs_last, 1, v_idx - 1); v_strs_last := substr(v_strs_last, v_idx + 1); pipe row(v_str); end loop; pipe row(v_strs_last); return; end strsplit;
- 查询显示。
select * from table(strsplit('"tom","jack","jerry","jobs","panda"'));
- 或者进行其他处理。进行其他处理的时候,我们涉及到从table类型中取出结果,刚开始的时候使用varchar2类型进行接收数据,然后并不能行。
declare TYPE split_type IS TABLE OF VARCHAR2 (4000); attrvalues split_type; begin select * into attrvalues from table(strsplit('"tom","jack","jerry","jobs","panda"'))) dbms_output.put_line('转换完成之后:'||attrvalues.column_value); end;
后来采用了下面的方法
declare TYPE split_type IS TABLE OF VARCHAR2 (4000); attrvalues split_type; begin for attrvalues in(select * from table(strsplit('"tom","jack","jerry","jobs","panda"'))) loop dbms_output.put_line('转换完成之后:'||attrvalues.column_value); end loop; end;