Add Procedure JSON_TO_DB2
This commit is contained in:
98
CISTOOLS/Procedures/JSON_TO_DB2.sql
Normal file
98
CISTOOLS/Procedures/JSON_TO_DB2.sql
Normal file
@@ -0,0 +1,98 @@
|
||||
SET PATH *LIBL ;
|
||||
|
||||
CREATE OR REPLACE PROCEDURE CISTOOLS.JSON_TO_DB2 (
|
||||
IN JSON_IN CLOB(2147483647) )
|
||||
DYNAMIC RESULT SETS 1
|
||||
LANGUAGE SQL
|
||||
SPECIFIC CISTOOLS.JSON_TO_DB2
|
||||
NOT DETERMINISTIC
|
||||
MODIFIES SQL DATA
|
||||
CALLED ON NULL INPUT
|
||||
PROGRAM TYPE SUB
|
||||
SET OPTION ALWBLK = *ALLREAD ,
|
||||
ALWCPYDTA = *OPTIMIZE ,
|
||||
COMMIT = *NONE ,
|
||||
DBGVIEW = *SOURCE ,
|
||||
DECRESULT = (31, 31, 00) ,
|
||||
DYNDFTCOL = *NO ,
|
||||
DYNUSRPRF = *OWNER ,
|
||||
SRTSEQ = *HEX
|
||||
BEGIN
|
||||
DECLARE FIRST_OBJ CLOB ( 5 M ) ;
|
||||
DECLARE COL_LIST CLOB ( 10 M ) DEFAULT '' ;
|
||||
DECLARE STMT CLOB ( 2 G ) ;
|
||||
DECLARE JSON_KEY VARCHAR ( 128 ) ;
|
||||
DECLARE PAD VARCHAR ( 3 ) DEFAULT ' ' ;
|
||||
DECLARE POS INT DEFAULT 1 ;
|
||||
DECLARE SEQ INT DEFAULT 1 ;
|
||||
-- cursor for returning the result
|
||||
DECLARE C1 CURSOR WITH RETURN FOR S1 ;
|
||||
SET PAD = ' ' ;
|
||||
FOR SELECT COL_NAME , COL_VALUE
|
||||
FROM TABLE (
|
||||
SELECT JT . KEY AS COL_NAME , JT . VALUE AS COL_VALUE
|
||||
FROM TABLE (
|
||||
VALUES JSON_QUERY ( JSON_IN , '$[0]' )
|
||||
) X ( FIRST_OBJ ) , TABLE (
|
||||
VALUES '[' ||
|
||||
REGEXP_REPLACE (
|
||||
REGEXP_REPLACE (
|
||||
REGEXP_REPLACE (
|
||||
FIRST_OBJ , '"([^"]*)":([^,}]*)' ,
|
||||
'{"key":"\1","value":\2}' ) , '\}\s*\}' ,
|
||||
'},' ) , '\{\s*\{' , '{' ) || ']'
|
||||
) Y ( PARSED_JSON ) , JSON_TABLE (
|
||||
PARSED_JSON ,
|
||||
'$[*]'
|
||||
COLUMNS (
|
||||
KEY VARCHAR ( 50 ) PATH '$.key' ,
|
||||
VALUE VARCHAR ( 50 ) PATH '$.value'
|
||||
)
|
||||
) AS JT
|
||||
)
|
||||
DO
|
||||
-- Decide type
|
||||
IF UPPER ( COL_VALUE ) IN ( 'TRUE' , 'FALSE' ) THEN
|
||||
SET COL_LIST = COL_LIST || PAD || DELIMIT_NAME ( COL_NAME ) ||
|
||||
' SMALLINT PATH ''$.' || COL_NAME || '''' ;
|
||||
ELSEIF REGEXP_LIKE ( COL_VALUE , '^-?[0-9]+(\.[0-9]+)?$' ) THEN
|
||||
IF REGEXP_COUNT ( COL_VALUE , '\.' ) = 1 THEN
|
||||
SET COL_LIST = COL_LIST || PAD || DELIMIT_NAME ( COL_NAME ) ||
|
||||
' Numeric(19,10) PATH ''$.' || COL_NAME || '''' ;
|
||||
ELSE
|
||||
SET COL_LIST = COL_LIST || PAD || DELIMIT_NAME ( COL_NAME ) ||
|
||||
' Integer PATH ''$.' || COL_NAME || '''' ;
|
||||
END IF ;
|
||||
ELSE
|
||||
SET COL_LIST = COL_LIST || PAD ||
|
||||
DELIMIT_NAME ( DELIMIT_NAME ( COL_NAME ) ) ||
|
||||
' VARCHAR(256) PATH ''$.' || COL_NAME || '''' ;
|
||||
END IF ;
|
||||
SET PAD = ', ' ;
|
||||
END FOR ;
|
||||
-- Step 3: build dynamic JSON_TABLE statement
|
||||
SET STMT = STRIP_SPACES ( '
|
||||
SELECT JT.*
|
||||
FROM JSON_TABLE(
|
||||
?,
|
||||
''$[*]''
|
||||
COLUMNS (
|
||||
' || COL_LIST || '
|
||||
)
|
||||
) AS jt
|
||||
' ) ;
|
||||
|
||||
SET CISTOOLS . SQL_STATEMENT = STMT ;
|
||||
-- Step 4: prepare and return cursor
|
||||
PREPARE S1 FROM STMT ;
|
||||
OPEN C1 USING JSON_IN ;
|
||||
END ;
|
||||
|
||||
GRANT ALTER , EXECUTE
|
||||
ON SPECIFIC PROCEDURE CISTOOLS.JSON_TO_DB2
|
||||
TO AMAPICS WITH GRANT OPTION ;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON SPECIFIC PROCEDURE CISTOOLS.JSON_TO_DB2
|
||||
TO PUBLIC ;
|
||||
|
||||
Reference in New Issue
Block a user