If you are converting from Sybase, you might run into issues for converting INT to HEX.
In Sybase:
1> select inttohex(234) 2> go -------- 000000EA (1 row affected)
In DB2:
DB2 => values hex(234) 1 -------- EA000000
If you want the same exact behavior from DB2, you could write a function that will do same as Sybase.
CREATE FUNCTION INT2HEX(N INTEGER) RETURNS VARCHAR(100) LANGUAGE SQL CONTAINS SQL BEGIN ATOMIC DECLARE RESULT VARCHAR(1000) DEFAULT ''; DECLARE IDX INTEGER DEFAULT 0; SET IDX = N; WHILE (IDX > 0) DO SET RESULT = SUBSTR('0123456789ABCDEF',(MOD(IDX,16)+1),1)||RESULT; SET IDX = IDX / 16; END WHILE; RETURN CHAR(RIGHT(REPEAT('0',8)||RESULT,8),8); END !
Run int2hex function in DB2
db2 => values int2hex(234) 1 ---------------------------- 000000EA 1 record(s) selected.
HEXTORAW in DB2
The output is a binary format and not string as you might think.
CREATE FUNCTION HEXTORAW( INSTR VARCHAR(32672) ) RETURNS VARCHAR(16336) FOR BIT DATA DETERMINISTIC EXTERNAL ACTION CONTAINS SQL BEGIN ATOMIC DECLARE RETURN_STR, TEMP_STR VARCHAR(16336) DEFAULT ''; DECLARE LEN INT; IF INSTR IS NULL THEN RETURN NULL; END IF; SET (TEMP_STR, LEN) = (INSTR, LENGTH(INSTR)); IF MOD( LEN, 2 ) = 1 THEN RETURN RAISE_ERROR('22018', 'HEXTORAW'); END IF; WHILE LEN > 0 DO SET (RETURN_STR, TEMP_STR, LEN) = (RETURN_STR || CHR((LOCATE(UCASE(SUBSTR(TEMP_STR,1,1)),'0123456789ABCDEF')-1) *16 + (LOCATE(UCASE(SUBSTR(TEMP_STR,2,1)),'0123456789ABCDEF')-1) ), SUBSTR(TEMP_STR, 3, LEN - 2), LEN - 2); END WHILE; RETURN RETURN_STR; END @
HEXTOSTR in DB2
The output is a string format and not binary.
CREATE FUNCTION HEXTOSTR( INSTR VARCHAR(32672) ) RETURNS VARCHAR(16336) DETERMINISTIC EXTERNAL ACTION CONTAINS SQL BEGIN ATOMIC DECLARE RETURN_STR, TEMP_STR VARCHAR(16336) DEFAULT ''; DECLARE LEN INT; IF INSTR IS NULL THEN RETURN NULL; END IF; SET (TEMP_STR, LEN) = (INSTR, LENGTH(INSTR)); IF MOD( LEN, 2 ) = 1 THEN RETURN RAISE_ERROR('22018', 'HEXTORAW'); END IF; WHILE LEN > 0 DO SET (RETURN_STR, TEMP_STR, LEN) = (RETURN_STR || CHR((LOCATE(UCASE(SUBSTR(TEMP_STR,1,1)),'0123456789ABCDEF')-1) *16 + (LOCATE(UCASE(SUBSTR(TEMP_STR,2,1)),'0123456789ABCDEF')-1) ), SUBSTR(TEMP_STR, 3, LEN - 2), LEN - 2); END WHILE; RETURN RETURN_STR; END @