From 371d891c608323599a7291ffc9b992a63d6416f0 Mon Sep 17 00:00:00 2001 From: Alex Zaw Date: Wed, 25 Feb 2026 23:02:21 +0000 Subject: [PATCH] Update Function SPLIT_STRING --- CISTOOLS/Functions/SPLIT_STRING.sql | 110 +++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/CISTOOLS/Functions/SPLIT_STRING.sql b/CISTOOLS/Functions/SPLIT_STRING.sql index a492be3..8fb61f8 100644 --- a/CISTOOLS/Functions/SPLIT_STRING.sql +++ b/CISTOOLS/Functions/SPLIT_STRING.sql @@ -1 +1,109 @@ -@@\@^@ % %@@@@Km@M@ %m@M]@k@ %m@M]@]@ %@@M@ %m@@k@ %@M]@]@@@ %@@ %@Km@ %@@ %@@@ %@@@@ %@@m@ %@@@@ %@@@@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@Mk@k@]@k@ %@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@\@@@ %@ %@ %@@@M@@k@m@k@m@]@@M@ %``@@@ %@\@ %@@M@ %@M@@k@@k@mm@M@ %m@k@m@k@@]@]@ %]@@M@@k@m@k@m@]@ %@@ %``@@@ %@@N@@k@m@N@@M@m@]@k@ %@ %@ %m@N@@M@m@]@L~@@M@ %m@]@ %@ %mm@M@ %m@k@m@k@m@N@ %@M@m@]@]@ %@@ %@ %@@ %@m@n@@ %@m@N@@M@m@]@L~@@M@ %m@]@ %]@@@k@ %@M@ %m@k@m@k@ %@ %@ %m@~@@ %@@M@m@]@`@m@N@@ %@m@`@m@ %@]@@@ %@@^@ %@@^@ % %@@k@@@@ %@@@Km@ %@@@@@^@ % %@@@@ %@@@Km@ %@@^@ % % %@@\@^@ % %@@@@Km@M@ %m@M]@k@ %m@@]@ %@@M@ %m@@k@ %@M]@]@@@ %@@ %@Km@ %@@ %@@@ %@@@@ %@@m@ %@@@@ %@@@@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@Mk@k@]@k@ %@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@\@@@ %@ %@@@k@@M@m@k@@k@m@]@ %@@M@ %@K@m@M@@M@m@]@]@ %]@@@ %@@M@M@@`@@]@k@m@]@~@@^@ %@@^@ % %@@k@@@@ %@@@Km@ %@@@@@^@ % %@@@@ %@@@Km@ %@@^@ % % \ No newline at end of file +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 ; +