Use this DB2 Stored Procedure to build an INSERT statement. This is very useful when you are developing some Java or .Net program or any other program and need an easy way to do this.
Thanks to Serge Rielau of DB2 Toronto lab for sharing this with the DB2 community. You can also download the script from here.
CREATE TABLE RESULT(text CLOB(2M));
DROP PROCEDURE insertscript;
--#SET TERMINATOR @
CREATE PROCEDURE insertscript(IN ptabschema VARCHAR(128),
IN ptabname VARCHAR(128),
IN pbatchsize INTEGER,
IN pterminator VARCHAR(2))
BEGIN
DECLARE SQLCODE INTEGER;
DECLARE SQLSTATE CHAR(5);
DECLARE inserttext CLOB(2M);
DECLARE selecttext CLOB(2M);
DECLARE insertheader CLOB(2M);
DECLARE colname VARCHAR(128);
DECLARE colcount INTEGER;
DECLARE colno INTEGER;
DECLARE rowcount INTEGER;
DECLARE insertcount INTEGER;
DECLARE colvalue CLOB(128);
DECLARE typeid SMALLINT;
DECLARE done SMALLINT;
DECLARE selectstmt STATEMENT;
DECLARE selectcur CURSOR WITH HOLD FOR selectstmt;
IF NOT EXISTS(SELECT 1 FROM SYSCAT.TABLES
WHERE tabschema = ptabschema
AND tabname = ptabname) THEN
SIGNAL SQLSTATE '78000' SET MESSAGE_TEXT = 'Table not found (remember case!)';
END IF;
DELETE FROM result;
SET insertheader = 'INSERT INTO "' || ptabschema || '"."'
|| ptabname || '" VALUES ';
SET selecttext = 'SELECT colno, colvalue, typeid FROM "'
|| ptabschema || '"."' || ptabname || '" AS T, LATERAL(VALUES ';
FOR column AS SELECT colno, colname, typename, codepage FROM SYSCAT.COLUMNS
WHERE tabschema = ptabschema
AND tabname = ptabname
ORDER BY colno
DO
SET typeid = CASE WHEN typename IN ('SMALLINT', 'INTEGER', 'BIGINT',
'FLOAT', 'DOUBLE', 'REAL', 'DECFLOAT',
'DECIMAL') THEN 1
WHEN typename IN ('CHAR', 'VARCHAR', 'GRAPHIC', 'VARGRAPHIC',
'CHARACTER', 'CLOB', 'DBCLOB') THEN
CASE WHEN codepage = 0 THEN 3 ELSE 2 END
WHEN typename = 'BLOB' THEN 4
ELSE RAISE_ERROR('78000', 'Unsupported type') END;
SET selecttext = selecttext
|| CASE WHEN colno > 0 THEN ',' ELSE '' END
|| '(SMALLINT(' || CHAR(colno)
|| '), ' || CASE WHEN typeid = 1
THEN 'TRIM(CHAR(T."' || colname || '")), '
WHEN typeid = 3
THEN 'HEX(T."' || colname || '"), '
WHEN typeid = 4
THEN 'HEX(VARCHAR(T."' || colname || '")), '
ELSE 'VARCHAR(T."' || colname || '"), ' END
|| CHAR(typeid) || ')';
SET colcount = colno;
END FOR;
SET selecttext = selecttext || ') AS S(colno, colvalue, typeid)';
PREPARE selectstmt FROM selecttext;
SET rowcount = 0;
SET insertcount = 0;
SET done = 0;
OPEN selectcur;
mainloop: WHILE rowcount < pbatchsize DO
IF rowcount = 0 THEN
SET inserttext = insertheader;
END IF;
subloop: LOOP
FETCH selectcur INTO colno, colvalue, typeid;
IF SQLCODE = 100 THEN
SET done = 1;
LEAVE subloop;
END IF;
SET inserttext = inserttext
|| CASE WHEN colno = 0 AND rowcount = 0 THEN '('
WHEN colno = 0 THEN '), ' || CHR(10) || chr(13) || '('
ELSE ',' END
|| CASE WHEN colvalue IS NULL THEN 'NULL'
WHEN typeid = 1 THEN colvalue
WHEN typeid = 2 THEN '''' || colvalue || ''''
WHEN typeid = 4 THEN 'BLOB(x''' || colvalue || ''')'
ELSE 'x''' || colvalue || '''' END;
IF colno = colcount THEN
SET rowcount = rowcount + 1;
END IF;
IF rowcount >= pbatchsize THEN LEAVE subloop; END IF;
END LOOP;
SET inserttext = inserttext || ')' || pterminator;
IF rowcount > 0 THEN
INSERT INTO RESULT VALUES inserttext;
SET rowcount = 0;
SET insertcount = insertcount + 1;
IF MOD(insertcount, 100) = 0 THEN
COMMIT;
END IF;
ELSE
LEAVE mainloop;
END IF;
END WHILE;
END
@
--#SET TERMINATOR ;
CALL insertscript('myschema', 'mytab', 10, ';');