110 lines
2.5 KiB
SQL
110 lines
2.5 KiB
SQL
SET PATH *LIBL ;
|
|
|
|
CREATE OR REPLACE FUNCTION CISTOOLS.SPLIT_STRING (
|
|
IN_STRING VARCHAR(32676) ,
|
|
IN_DELIMITOR VARCHAR(32) )
|
|
RETURNS TABLE (
|
|
ROW_NUM INTEGER ,
|
|
FRAGMENT VARCHAR(32676) )
|
|
LANGUAGE SQL
|
|
SPECIFIC CISTOOLS.SPLIT_CHAR
|
|
NOT DETERMINISTIC
|
|
READS SQL DATA
|
|
CALLED ON NULL INPUT
|
|
PROGRAM NAME SPLIT_CHAR
|
|
CONCURRENT ACCESS RESOLUTION DEFAULT
|
|
SET OPTION ALWBLK = *ALLREAD ,
|
|
ALWCPYDTA = *OPTIMIZE ,
|
|
COMMIT = *NONE ,
|
|
DECRESULT = (31, 31, 00) ,
|
|
DYNDFTCOL = *NO ,
|
|
DYNUSRPRF = *USER ,
|
|
SQLCURRULE = *STD ,
|
|
SRTSEQ = *HEX
|
|
BEGIN
|
|
RETURN
|
|
WITH RECURSIVE CHUNKS ( IDX , START_POS , NEXT_POS ) AS (
|
|
-- base case
|
|
SELECT *
|
|
FROM TABLE (
|
|
VALUES ( 1 , 1 , LOCATE_IN_STRING (
|
|
IN_STRING , IN_DELIMITOR , 1 ) )
|
|
) X ( IDX , START_POS , NEXT_POS )
|
|
UNION ALL
|
|
-- recursive case
|
|
SELECT IDX + 1 , NEXT_POS + LENGTH ( IN_DELIMITOR ) ,
|
|
CASE
|
|
WHEN
|
|
NEXT_POS + LENGTH ( IN_DELIMITOR ) <= LENGTH (
|
|
IN_STRING )
|
|
THEN
|
|
LOCATE_IN_STRING (
|
|
IN_STRING , IN_DELIMITOR , NEXT_POS +
|
|
LENGTH ( IN_DELIMITOR ) )
|
|
ELSE 0
|
|
END
|
|
FROM CHUNKS
|
|
WHERE NEXT_POS > 0
|
|
AND NEXT_POS + LENGTH ( IN_DELIMITOR ) <= LENGTH (
|
|
IN_STRING )
|
|
) SELECT IDX ,
|
|
SUBSTR (
|
|
IN_STRING , START_POS ,
|
|
CASE
|
|
WHEN
|
|
NEXT_POS = 0
|
|
THEN LENGTH ( IN_STRING ) - START_POS + 1
|
|
ELSE NEXT_POS - START_POS
|
|
END ) AS FRAGMENT
|
|
FROM CHUNKS ;
|
|
END ;
|
|
|
|
GRANT ALTER , EXECUTE
|
|
ON SPECIFIC FUNCTION CISTOOLS.SPLIT_CHAR
|
|
TO AMAPICS WITH GRANT OPTION ;
|
|
|
|
GRANT EXECUTE
|
|
ON SPECIFIC FUNCTION CISTOOLS.SPLIT_CHAR
|
|
TO PUBLIC ;
|
|
|
|
|
|
SET PATH *LIBL ;
|
|
|
|
CREATE OR REPLACE FUNCTION CISTOOLS.SPLIT_STRING (
|
|
IN_STRING VARCHAR(32676) ,
|
|
IN_LEN INTEGER )
|
|
RETURNS TABLE (
|
|
ROW_NUM INTEGER ,
|
|
FRAGMENT VARCHAR(32676) )
|
|
LANGUAGE SQL
|
|
SPECIFIC CISTOOLS.SPLIT_LEN
|
|
NOT DETERMINISTIC
|
|
READS SQL DATA
|
|
CALLED ON NULL INPUT
|
|
PROGRAM NAME SPLIT_LEN
|
|
CONCURRENT ACCESS RESOLUTION DEFAULT
|
|
SET OPTION ALWBLK = *ALLREAD ,
|
|
ALWCPYDTA = *OPTIMIZE ,
|
|
COMMIT = *NONE ,
|
|
DECRESULT = (31, 31, 00) ,
|
|
DYNDFTCOL = *NO ,
|
|
DYNUSRPRF = *USER ,
|
|
SQLCURRULE = *STD ,
|
|
SRTSEQ = *HEX
|
|
BEGIN
|
|
RETURN SELECT RN , SUBSTR ( IN_STRING , RN , IN_LEN )
|
|
FROM TABLE (
|
|
CISTOOLS . ROWS_COUNTER ( LENGTH ( IN_STRING ) )
|
|
) AS X
|
|
WHERE MOD ( ( RN - 1 ) , IN_LEN ) = 0 ;
|
|
END ;
|
|
|
|
GRANT ALTER , EXECUTE
|
|
ON SPECIFIC FUNCTION CISTOOLS.SPLIT_LEN
|
|
TO AMAPICS WITH GRANT OPTION ;
|
|
|
|
GRANT EXECUTE
|
|
ON SPECIFIC FUNCTION CISTOOLS.SPLIT_LEN
|
|
TO PUBLIC ;
|
|
|