z / OS上的DB2的HEX TO RAW函数

时间:2014-08-28 14:16:47

标签: sql db2

我需要将INT值转换为 HEX(不是 hex)。

例如,给定值1234,我想将其转换为x'1234'。

我的第一个倾向是使用十六进制函数,但这不会产生预期的结果:

hex(1234) = x'04D2' 

我需要一个函数或算法

my_function(1234) = x'1234'
  编辑:感谢Lennart的回答,我了解到它将等同于HEXTORAW或者   VARCHAR_BIT_FORMAT存在于DB2 for LUW上,但不适用于z / OS

2 个答案:

答案 0 :(得分:1)

我不确定我理解你的问题,这是在球场吗?

 with t (s) as (values ('1234'),(x'F0F0F0F0F0F0F0F0F0F0F0F0F0')) 
 select s
      , case when translate(s, '', '0123456789') = '' 
             then hextoraw(s) 
             else s 
        end
 from t;

 S             2                         
 ------------- --------------------------
 1234          x'1234'
 ððððððððððððð      ððððððððððððð                      

答案 1 :(得分:0)

可以使用EBCDIC_CHR功能进行此转换。此解决方案假定您的系统字符编码为EBCDIC。

请参阅此主题以供讨论,以及UDF:http://www.idug.org/p/fo/st/thread=43924

此用户定义的函数来自该线程。它将接收varchar输入,并且对于每对值,使用EBCDIC_CHR将它们转换为raw,将它们连接在一起。

CREATE FUNCTION UDFUNC.HEX2RAW(INSTR VARCHAR(1024)) 
RETURNS VARCHAR(2048) 
DETERMINISTIC 
NO EXTERNAL ACTION 
CONTAINS SQL 
BEGIN 
  DECLARE invalid_hexval CONDITION FOR SQLSTATE '22007';
  DECLARE VALIDSTR VARCHAR(1024) default '';
  DECLARE OUTSTR VARCHAR(2048) DEFAULT '';
  DECLARE HEXCHR CHAR(16) DEFAULT '0123456789ABCDEF'; 
  DECLARE MODVAL INT DEFAULT 0;
  DECLARE LENSTR INT;
  DECLARE I INT DEFAULT 0; 
  DECLARE J INT DEFAULT 0; 

  IF INSTR IS NULL THEN 
     RETURN NULL; 
  END IF; 

  set VALIDSTR = TRANSLATE(INSTR,'',HEXCHR);

  IF (VALIDSTR <> '') THEN
     SIGNAL invalid_hexval SET MESSAGE_TEXT = 'Not Hex: [' || CAST(INSTR AS VARCHAR(59))||']';
  END IF;

  SET MODVAL = MOD(LENGTH(INSTR),2);

  IF MODVAL <> 0 THEN 
     SET INSTR = CONCAT('0',INSTR);
  END IF;

  SET LENSTR = LENGTH(INSTR); 

  WHILE I < LENSTR DO 
     SET J = 16 * (POSSTR(HEXCHR,SUBSTR(INSTR,I+1,1))-1); 
     SET I = I + 1; 
     SET J = J + (POSSTR(HEXCHR,SUBSTR(INSTR,I+1,1))-1); 
     SET I = I + 1; 
     SET OUTSTR = CONCAT(OUTSTR,EBCDIC_CHR(J)); 
  END WHILE; 
  RETURN OUTSTR; 
END# 

功能用法:

SELECT UDFUNC.HEX2RAW('1234')
     , HEX(UDFUNC.HEX2RAW('1234'))
     , UDFUNC.HEX2RAW('1234567')
     , HEX(UDFUNC.HEX2RAW('1234567'))
FROM SYSIBM.SYSDUMMY1;

结果:

 1  2    3    4
 -- ---- ---- --------
    1234   áÅ 01234567