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


§ 1. 语法

RAWTOHEX(expr)
1

§ 2. 定义和用法

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

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

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

§ 3. Oracle兼容说明

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

RAWTOHEX 输入 ORACLE GreatSQL
RAWTOHEX(1) C102 ERROR 3064 (HY000): Incorrect type for argument args 0 in function rawtohex.
RAWTOHEX(sysdate) E7070B06081C2300 ERROR 3064 (HY000): Incorrect type for argument args 0 in function rawtohex.

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

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

输出结果为:

+------+
| a    |
+------+
| AB   |
+------+
1 row in set (0.00 sec)

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

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

§ 4. 示例

greatsql> SELECT RAWTOHEX(NULL) FROM DUAL;
+----------------+
| RAWTOHEX(NULL) |
+----------------+
| NULL           |
+----------------+

greatsql> SELECT RAWTOHEX('A') FROM DUAL;
+---------------+
| RAWTOHEX('A') |
+---------------+
| 41            |
+---------------+

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

greatsql-wx