羲和(Halo)数据库RAW类型初体验

2024年 6月 28日 39.5k 0

一、RAW类型回顾

在Oracle数据库中,RAW类型是一种可变长数据类型,一般用于存储二进制数据。在使用RAW类型时,必须指定具体长度,语法如下:

RAW(size)

在SQL场景用作表中的字段时,最大可存储2000字节数据(当且仅当Oracle参数MAX_STRING_SIZE = STANDARD时),而用作PL/SQL场景的变量时,最大可存储32767字节数据。

SQL> show parameter MAX_STRING_SIZE

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
max_string_size string STANDARD
SQL> -- 未指定raw数据类型长度 报错
SQL> CREATE TABLE test_raw(a raw);
CREATE TABLE test_raw(a raw)
*
ERROR at line 1:
ORA-00906: missing left parenthesis

SQL> -- SQL场景2000字节大小 成功创建
SQL> CREATE TABLE test_raw(a raw(2000));

Table created.

SQL> -- SQL场景超过2000字节 报错
SQL> CREATE TABLE test_raw2(a raw(2001));
CREATE TABLE test_raw2(a raw(2001))
*
ERROR at line 1:
ORA-00910: specified length too long for its datatype

SQL> -- PL/SQL场景 定义变量32767字节大小
SQL> DECLARE
2 va raw(2001);
3 BEGIN
4 va := 'ff';
5 END;
6 /

PL/SQL procedure successfully completed.

SQL> -- PL/SQL场景 定义变量超过32767字节大小 报错
SQL> DECLARE
2 va raw(32768);
3 BEGIN
4 va := 'ff';
5 END;
6 /
va raw(32768);
*
ERROR at line 2:
ORA-06550: line 2, column 8:
PLS-00215: String length constraints must be in range (1 .. 32767)

raw类型接收十六进制数据(0~9 和 A~F 或 a~f),如直接输入的数据不符合规范将会报错,比如说’gg’

SQL> -- 接收十六进制数据
SQL> DECLARE
2 va raw(20);
3 BEGIN
4 va := '09afAF';
5 END;
6 /

PL/SQL procedure successfully completed.

SQL> -- 直接输入非十六进制数据将会报错
SQL> DECLARE
2 va raw(20);
3 BEGIN
4 va := 'gg';
5 END;
6 /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
ORA-06512: at line 4

也可以考虑使用函数的方式传入传出数据,先以HEXTORAW、RAWTOHEX为例

HEXTORAW将十六进制字符串数据转换成数据,RAWTOHEX则相反,将raw类型数据转换成对应的十六进制字符串

SQL> set serveroutput on
SQL> DECLARE
2 va raw(20) := HEXTORAW('ff');
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(('va: '||va));
5 DBMS_OUTPUT.PUT_LINE(('RAWTOHEX(va): '||RAWTOHEX(va)));
6 DBMS_OUTPUT.PUT_LINE('ff ~= HEXTORAW(ff) is '|| (case when 'ff' ~= va then 'true' else 'false' end));
7 END;
8 /
va: FF
RAWTOHEX(va): FF
ff ~= HEXTORAW(ff) is true

PL/SQL procedure successfully completed.

或者是使用UTL_RAW这个系统包,比如说UTL_RAW.CAST_TO_RAW、UTL_RAW.CAST_TO_VARCHAR2

UTL_RAW.CAST_TO_RAW,将输入的varchar2类型数据,比如说中文转换成对应的raw类型数据

UTL_RAW.CAST_TO_VARCHAR2 将raw类型数据转换成对应的varchar2类型数据

SQL> SELECT UTL_RAW.CAST_TO_RAW('ORACLE') FROM dual;

UTL_RAW.CAST_TO_RAW('ORACLE')
--------------------------------------------------------------------------------
4F5241434C45

SQL> SELECT UTL_RAW.CAST_TO_VARCHAR2('4F5241434C45') FROM dual;

UTL_RAW.CAST_TO_VARCHAR2('4F5241434C45')
--------------------------------------------------------------------------------
ORACLE

SQL> SELECT UTL_RAW.CAST_TO_RAW('羲和(Halo)数据库') FROM dual;

UTL_RAW.CAST_TO_RAW('羲和(HALO)数据库')
--------------------------------------------------------------------------------
E7BEB2E5928C2848616C6F29E695B0E68DAEE5BA93

SQL> SELECT UTL_RAW.CAST_TO_VARCHAR2('E7BEB2E5928C2848616C6F29E695B0E68DAEE5BA93') FROM dual;

UTL_RAW.CAST_TO_VARCHAR2('E7BEB2E5928C2848616C6F29E695B0E68DAEE5BA93')
--------------------------------------------------------------------------------
羲和(Halo)数据库

二、羲和(Halo)数据库表现

羲和(Halo)数据库RAW类型初体验-1

raw类型处理十六进制数据

羲和(Halo)数据库RAW类型初体验-2

HEXTORAW、RAWTOHEX函数

羲和(Halo)数据库RAW类型初体验-3

UTL_RAW系统包

羲和(Halo)数据库RAW类型初体验-4

如需完整体验上述的RAW类型,请使用羲和16或者升级至羲和16上(预告,即将发布!)进行体验。

三、声明

若文中存在错误或不当之处,敬请指出,以便我进行修正和完善。希望这篇文章能够帮助到各位。

文章转载请联系,谢谢合作。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论