From c9b5ec4b456c3e19cf77051d2a6f113e4cd81e0b Mon Sep 17 00:00:00 2001 From: Alex Zaw Date: Wed, 25 Feb 2026 23:03:28 +0000 Subject: [PATCH] Add Procedure JSON_TO_DB2 --- CISTOOLS/Procedures/JSON_TO_DB2.sql | 98 +++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 CISTOOLS/Procedures/JSON_TO_DB2.sql diff --git a/CISTOOLS/Procedures/JSON_TO_DB2.sql b/CISTOOLS/Procedures/JSON_TO_DB2.sql new file mode 100644 index 0000000..baade6b --- /dev/null +++ b/CISTOOLS/Procedures/JSON_TO_DB2.sql @@ -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 ; +