暂无图片
暂无图片
2
暂无图片
暂无图片
1
暂无图片

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

原创 小满未满、 2024-06-28
1904

一、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)数据库表现

raw类型处理十六进制数据

HEXTORAW、RAWTOHEX函数

UTL_RAW系统包

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

三、声明

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

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

最后修改时间:2024-06-28 11:53:38
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

贾桂权
暂无图片
7月前
评论
暂无图片 0
在Oracle数据库中,RAW类型是一种可变长数据类型,一般用于存储二进制数据。
7月前
暂无图片 点赞
评论