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
@