逗号分隔的字符串转换为行数据(collection)(续)

逗号分隔的字符串转行数据的存储过程一个:

CREATE OR REPLACE FUNCTION SP_YX_SPLIT
(
    p_list CLOB, 
    p_sep VARCHAR2 := ','
) 
RETURN tabletype
PIPELINED 
/************************************** 
* Name: split 
* Author: zhaoqiang. 
* Date: 2014-10-03. 
* Function: 返回字符串被指定字符分割后的表类型。 
* Parameters: p_list: 待分割的字符串。 
p_sep: 分隔符,默认逗号,也可以指定字符或字符串。 
* Example: SELECT * 
FROM users 
WHERE u_id IN (SELECT COLUMN_VALUE 
FROM table (split ('1,2'))) 
返回u_id为1和2的两行数据。 
**************************************/ 
IS 
    l_idx PLS_INTEGER; 
    v_list VARCHAR2 (32676) := 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; 
END;

2,调用存储过程方法,获取转化后的行数据(collection)

select SP_YX_SPLIT('2,43,43,43',',') from dual

打开Collection,可看到是这个字段是一个只有一列的列名为COLUMN_VALUE的表。

3,得到的这个值,因为是collection,不能直接使用。例如:

4,所以必须先把这个语句转化成Table类型。然后,当作一个表Table使用,通过COLUMN_VALUE获取里面的值。

5,使用表,获取值。

where gs.movetypeid='201' and gs.createdate between '20161203' and '20161203'   
and gs.customerid='00010'
and m1.materialsortid in (SELECT COLUMN_VALUE FROM table ((select SP_YX_SPLIT('00000000000000001283,00000000000000000714',',') from dual)))
原文地址:https://www.cnblogs.com/alsf/p/6128837.html