Hi folks,
I've seen two use cases and heard of many more where developers need to convert comma-delimited strings into table representation.
Following is an example of how to accomplish this with a stored procedure. When evaluating your use case, consider where or not this can be done at the app-server level.
Cheers,
Jody
DROP TYPE T_CSV_ITAB; CREATE TYPE T_CSV_ITAB AS TABLE (PARSED_VAL NVARCHAR(5000)); DROP PROCEDURE CSV_STRING_TO_ITAB; CREATE PROCEDURE CSV_STRING_TO_ITAB ( IN DELIM_STRING NVARCHAR(5000), IN DELIM_CHAR NCHAR(1), OUT OUT_TABLE T_CSV_ITAB ) LANGUAGE SQLSCRIPT READS SQL DATA WITH RESULT VIEW CSV_ITAB AS V_DELIM_STRING NVARCHAR(2000); V_DELIM_CHAR NVARCHAR(10) := ','; PARSED_VALUE NVARCHAR(100); V_DELIM_STR NVARCHAR(10) := ':'; BEGIN -- get delimiter IF :DELIM_CHAR != '' THEN V_DELIM_CHAR := :DELIM_CHAR; END IF; -- remove leading/trailing whitespace V_DELIM_STRING := TRIM(:DELIM_STRING) || TRIM(:V_DELIM_CHAR); -- get the first value OUT_TABLE = SELECT SUBSTR_BEFORE(:V_DELIM_STRING, :V_DELIM_CHAR) AS PARSED_VAL FROM DUMMY; -- get the remaining string V_DELIM_STRING := SUBSTR_AFTER(:V_DELIM_STRING, :V_DELIM_CHAR); -- parse out the values WHILE :V_DELIM_STRING != '' DO a = SELECT SUBSTR_BEFORE(:V_DELIM_STRING, :V_DELIM_CHAR) AS PARSED_VAL FROM DUMMY; -- build the table OUT_TABLE = SELECT * FROM :a UNION ALL SELECT * FROM :OUT_TABLE; V_DELIM_STRING := SUBSTR_AFTER(:V_DELIM_STRING, :V_DELIM_CHAR); END WHILE; END; -- usage demo DROP PROCEDURE CSV_TESTER; CREATE PROCEDURE CSV_TESTER AS TEST_STRING NVARCHAR(100) := 'A,B,C'; DELIMITER NCHAR(1) := ','; BEGIN CALL CSV_STRING_TO_ITAB(:TEST_STRING, :DELIMITER, a); SELECT * FROM :a; END; CALL CSV_TESTER;