Oracle兼容-函数-RAWTOHEX()函数


1. 语法

  1. RAWTOHEX(expr)

2. 定义和用法

RAWTOHEX() 函数的作用是将 expr 转换为用十六进制表示的字符值。

RAWTOHEX() 函数只接受 CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSETRAWVARCHAR2 等数据类型的参数。

函数返回一个字符串,由构成原始值字节的十六进制表示,即每个字节由两个十六进制数字表示。

3. Oracle兼容说明

在Oracle中,expr参数支持的类型为除 LONG,LONG RAW,CLOB,NCLOB,BLOB,BFILE 之外的任何标量数据类型,而GreatSQL中仅支持上面提到的几个数据类型。

RAWTOHEX 输入ORACLEGreatSQL
RAWTOHEX(1)C102ERROR 3064 (HY000): Incorrect type for argument args 0 in function rawtohex.
RAWTOHEX(sysdate)E7070B06081C2300ERROR 3064 (HY000): Incorrect type for argument args 0 in function rawtohex.

本函数在只允许用于存储程序的语句中时与在可以独立执行的SQL语句中时的工作方式不同。前者在函数转换为十六进制值之前执行隐式转换,这可能会导致本函数在不同场景返回不同的值。例如:

  1. DECLARE
  2. a varchar2(8);
  3. BEGIN
  4. a := rawtohex('AB');
  5. SELECT a;
  6. SELECT RAWTOHEX('AB') INTO a FROM DUAL;
  7. SELECT a;
  8. END;

输出结果为:

  1. +------+
  2. | a |
  3. +------+
  4. | AB |
  5. +------+
  6. 1 row in set (0.00 sec)
  7. +------+
  8. | a |
  9. +------+
  10. | 4142 |
  11. +------+
  12. 1 row in set (0.00 sec)

产生差异的原因是在只允许用于存储程序的语句中时将’AB’隐式转换为RAW类型(即将 ‘AB’ 视为等于 0xAB 的单个字节),然后再传递给 RAWTOHEX() 进行转换,所以返回字符串 ‘AB’。然而,在可以独立执行的 SQL 语句中时并没有进行这种隐式转换,此时 ‘AB’ 已经是 2 字节的 RAW,所以返回 4142。

4. 示例

  1. greatsql> SELECT RAWTOHEX(NULL) FROM DUAL;
  2. +----------------+
  3. | RAWTOHEX(NULL) |
  4. +----------------+
  5. | NULL |
  6. +----------------+
  7. greatsql> SELECT RAWTOHEX('A') FROM DUAL;
  8. +---------------+
  9. | RAWTOHEX('A') |
  10. +---------------+
  11. | 41 |
  12. +---------------+
  13. greatsql> SELECT RAWTOHEX(UNHEX('A')) FROM DUAL;
  14. +----------------------+
  15. | RAWTOHEX(UNHEX('A')) |
  16. +----------------------+
  17. | 0A |
  18. +----------------------+

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx