Reputation: 618
I am trying to write a db2 function, below is the code
CREATE OR REPLACE FUNCTION SPLIT_STRING (INPUT VARCHAR(8000), DELIMITER
CHAR(1) DEFAULT ',')
RETURNS TABLE (str VARCHAR(8000))
SPECIFIC SPLIT_STRING
LANGUAGE SQL
DETERMINISTIC
NO EXTERNAL ACTION
BEGIN ATOMIC
DECLARE @MSG VARCHAR(30)
SET @MSG ='INVALID INPUT'
IF (INPUT IS NULL) THEN RETURN @MSG
ELSE
RETURN
WITH R1 (str, REMAINDER) AS
(SELECT SUBSTR(INPUT, 1, LOCATE(DELIMITER, INPUT) -1) AS str,
SUBSTR(INPUT, LOCATE(DELIMITER, INPUT) +1 , LENGTH(INPUT))
REMAINDER FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT SUBSTR(REMAINDER, 1, LOCATE(DELIMITER, REMAINDER)-1) AS str,
SUBSTR(REMAINDER, LOCATE(DELIMITER, REMAINDER)+1, LENGTH(REMAINDER))
REMAINDER FROM R1
WHERE LOCATE(DELIMITER, REMAINDER) > 0
UNION ALL
SELECT SUBSTR(REMAINDER, LOCATE(DELIMITER, REMAINDER)+1,
LENGTH(REMAINDER)) AS str,'' AS REMAINDER FROM R1 WHERE REMAINDER <> ''
AND LOCATE(DELIMITER, REMAINDER) = 0
)SELECT str FROM R1
END IF
END;
If I remove the IF condition which am using for Input parameter validation function gets created fine else getting below error.
DB21034E The command was processed as an SQL statement because it was
not a valid Command Line Processor command. During SQL processing it returned:SQL0104N An unexpected token "SET" was found following "RE @MSG VARCHAR(30) ". Expected tokens may include: <SQL_variable_declarations>". LINE NUMBER=8. SQLSTATE=42601
Upvotes: 0
Views: 746
Reputation: 12314
String splitter.
CREATE OR REPLACE FUNCTION SPLIT_STRING (INPUT VARCHAR(8000), DELIMITER CHAR(1) DEFAULT ',')
RETURNS TABLE (str VARCHAR(8000))
SPECIFIC SPLIT_STRING
LANGUAGE SQL
DETERMINISTIC
NO EXTERNAL ACTION
return
select str
from xmltable('for $id in tokenize($s, $p) return <i>{string($id)}</i>'
passing
--INPUT as "s"
COALESCE(INPUT, CAST(RAISE_ERROR('70001', 'INVALID INPUT') AS VARCHAR(8000))) as "s"
, DELIMITER as "p"
columns
str varchar(8000) path '.'
) t;
Upvotes: 2