Oracle RAW类型基本操作函数及使用示例

本文介绍了 Oracle 数据库中 RAW 类型的基本概念及其常用操作函数,包括长度计算、字符串拼接、子串获取等,并通过实例展示了如何进行位操作、类型转换及其它高级功能。

RAW类型是Oracle中用于保存位串的一种数据类型,类似于CHAR,使用RAW(L) 方式声明,最长可达32767字节。
系统提供了一个SYS.utl_raw工具包用于RAW类型的操作,常用的函数如下:

1、长度计算函数,得到一个raw类型变量的长度,单位为字节

  FUNCTION length(r IN RAW) RETURN NUMBER;
如:
select utl_raw.length('12344321') from dual;
结果为:4

2、拼接函数,用于拼接两个raw类型变量
  FUNCTION concat(r1  IN RAW DEFAULT NULL,
                  r2  IN RAW DEFAULT NULL,
                  r3  IN RAW DEFAULT NULL,
                  r4  IN RAW DEFAULT NULL,
                  r5  IN RAW DEFAULT NULL,
                  r6  IN RAW DEFAULT NULL,
                  r7  IN RAW DEFAULT NULL,
                  r8  IN RAW DEFAULT NULL,
                  r9  IN RAW DEFAULT NULL,
                  r10 IN RAW DEFAULT NULL,
                  r11 IN RAW DEFAULT NULL,
                  r12 IN RAW DEFAULT NULL) RETURN RAW;
如:
select utl_raw.concat('12','34') from dual;
结果为:1234

3、获取子串函数
  FUNCTION substr(r   IN RAW,
                  pos IN BINARY_INTEGER,
                  len IN BINARY_INTEGER DEFAULT NULL) RETURN RAW;

如:
select utl_raw.substr('12344321',2,1) from dual;
结果为:34

4、位操作函数
  FUNCTION bit_and(r1 IN RAW,
                   r2 IN RAW) RETURN RAW;
  FUNCTION bit_or(r1 IN RAW,
                  r2 IN RAW) RETURN RAW;
  FUNCTION bit_xor(r1 IN RAW,
                   r2 IN RAW) RETURN RAW;
如:
select utl_raw.bit_and('12344321','0f') from dual;
select utl_raw.bit_or('12344321','0f') from dual;
select utl_raw.bit_xor('12344321','0f') from dual;
结果分别为:
02344321、1F344321、1D344321

5、给指定字节赋值
  FUNCTION overlay(overlay_str IN RAW,
                   target      IN RAW,
                   pos         IN BINARY_INTEGER DEFAULT 1,
                   len         IN BINARY_INTEGER DEFAULT NULL,
                   pad         IN RAW            DEFAULT NULL) RETURN RAW;
如:
select utl_raw.overlay('aa','12344321',2,1) from dual;
结果为:12AA4321

6、类型转换函数
  FUNCTION cast_to_raw(c IN VARCHAR2 CHARACTER SET ANY_CS) RETURN RAW;
  FUNCTION cast_to_varchar2(r IN RAW) RETURN VARCHAR2;
  FUNCTION cast_to_nvarchar2(r IN RAW) RETURN NVARCHAR2;
  FUNCTION cast_to_number(r IN RAW) RETURN NUMBER;
  FUNCTION cast_from_number(n IN NUMBER) RETURN RAW;
  FUNCTION cast_to_binary_integer(r IN RAW,
                                  endianess IN PLS_INTEGER
                                     DEFAULT 1)
                                  RETURN BINARY_INTEGER;
  FUNCTION cast_from_binary_integer(n         IN BINARY_INTEGER,
                                    endianess IN PLS_INTEGER
                                      DEFAULT 1)
                                    RETURN RAW;
  FUNCTION cast_from_binary_float(n         IN BINARY_FLOAT,
                                  endianess IN PLS_INTEGER
                                    DEFAULT 1)
                                  RETURN RAW;
  FUNCTION cast_to_binary_float(r IN RAW,
                                endianess IN PLS_INTEGER
                                  DEFAULT 1)
                                RETURN BINARY_FLOAT;
  FUNCTION cast_from_binary_double(n         IN BINARY_DOUBLE,
                                   endianess IN PLS_INTEGER
                                     DEFAULT 1)
                                   RETURN RAW;
  FUNCTION cast_to_binary_double(r IN RAW,
                                 endianess IN PLS_INTEGER
                                   DEFAULT 1)
                                 RETURN BINARY_DOUBLE;

7、其他函数
指定值替换
  FUNCTION translate(r        IN RAW,
                     from_set IN RAW,
                     to_set   IN RAW) RETURN RAW;
指定值替换,长度不足填充
  FUNCTION transliterate(r        IN RAW,
                         to_set   IN RAW DEFAULT NULL,
                         from_set IN RAW DEFAULT NULL,
                         pad      IN RAW DEFAULT NULL) RETURN RAW;
复制函数
  FUNCTION copies(r IN RAW,
                  n IN NUMBER) RETURN RAW;
得到指定范围内值组成的串
  FUNCTION xrange(start_byte IN RAW DEFAULT NULL,
                  end_byte   IN RAW DEFAULT NULL) RETURN RAW;
反转函数
  FUNCTION reverse(r IN RAW) RETURN RAW;
比较函数
  FUNCTION compare(r1  IN RAW,
                   r2  IN RAW,
                   pad IN RAW DEFAULT NULL RETURN NUMBER;
转换函数
  FUNCTION convert(r            IN RAW,
                   to_charset   IN VARCHAR2,
                   from_charset IN VARCHAR2) RETURN RAW;
按位求余函数
  FUNCTION bit_complement(r IN RAW) RETURN RAW;


下面是一个小例子,求出指定raw类型数值中0位所在的位置及总位数。

-- Created on 2017/5/17 by ADMINISTRATOR 
declare 
  -- Local variables here
  i integer;
  j integer;

  len number(3) := 0;
  pos number(3) := 0;
  count1 number(3) := 0;
  vec RAW(32) := 'FF11AA3344DDEEBBAA11998855367833FF11AA3344DDEEBBAA11998855367833';
  nvec RAW(4);
  nvec2 RAW(4);
  
  v_start     TIMESTAMP(8) ;
  v_end     TIMESTAMP(8) ;
  v_interval INTERVAL DAY TO SECOND; 
  
begin
  -- Test statements here
  len := utl_raw.length(vec);
  DBMS_OUTPUT.put_line('Vector = ' || vec);

  v_start := sysdate;
  DBMS_OUTPUT.put_line('v_start = ' || v_start);

  for i in 1..len
  LOOP     
     nvec := utl_raw.substr(vec,i,1);
     IF utl_raw.compare(nvec,'ff') != 0
     THEN             
          FOR j IN 1..8
          LOOP
              nvec2 := utl_raw.substr(utl_raw.cast_from_binary_integer(1*power(2,(8-j))),4,1); 
             
              IF utl_raw.bit_and(nvec, nvec2) != nvec2
              THEN   
                 pos := 8*(i-1)+j;
                 count1 := count1 + 1;
                 DBMS_OUTPUT.put_line('pos = ' || pos);

              END IF;
          END LOOP;
     END IF;
  END LOOP;
  
  DBMS_OUTPUT.put_line('count1 = ' || count1);
  
  v_end := sysdate;
  DBMS_OUTPUT.put_line('v_end = ' || v_end);
  v_interval := (v_end - v_start) DAY TO SECOND;
  DBMS_OUTPUT.put_line('v_interval = ' || v_interval);

end;

计算结果如下:

Vector = FF11AA3344DDEEBBAA11998855367833FF11AA3344DDEEBBAA11998855367833
v_start = 18-5月 -17 02.03.12.00000000 下午
pos = 9
pos = 10
pos = 11
pos = 13
pos = 14
pos = 15
pos = 18
pos = 20
pos = 22
pos = 24
pos = 25
pos = 26
pos = 29
pos = 30
pos = 33
pos = 35
pos = 36
pos = 37
pos = 39
pos = 40
pos = 43
pos = 47
pos = 52
pos = 56
pos = 58
pos = 62
pos = 66
pos = 68
pos = 70
pos = 72
pos = 73
pos = 74
pos = 75
pos = 77
pos = 78
pos = 79
pos = 82
pos = 83
pos = 86
pos = 87
pos = 90
pos = 91
pos = 92
pos = 94
pos = 95
pos = 96
pos = 97
pos = 99
pos = 101
pos = 103
pos = 105
pos = 106
pos = 109
pos = 112
pos = 113
pos = 118
pos = 119
pos = 120
pos = 121
pos = 122
pos = 125
pos = 126
pos = 137
pos = 138
pos = 139
pos = 141
pos = 142
pos = 143
pos = 146
pos = 148
pos = 150
pos = 152
pos = 153
pos = 154
pos = 157
pos = 158
pos = 161
pos = 163
pos = 164
pos = 165
pos = 167
pos = 168
pos = 171
pos = 175
pos = 180
pos = 184
pos = 186
pos = 190
pos = 194
pos = 196
pos = 198
pos = 200
pos = 201
pos = 202
pos = 203
pos = 205
pos = 206
pos = 207
pos = 210
pos = 211
pos = 214
pos = 215
pos = 218
pos = 219
pos = 220
pos = 222
pos = 223
pos = 224
pos = 225
pos = 227
pos = 229
pos = 231
pos = 233
pos = 234
pos = 237
pos = 240
pos = 241
pos = 246
pos = 247
pos = 248
pos = 249
pos = 250
pos = 253
pos = 254
count1 = 124
v_end = 18-5月 -17 02.03.12.00000000 下午
v_interval = +00 00:00:00.000000













































### Oracle 数据库中用于查询数据类型函数Oracle 数据库中,虽然没有专门的函数直接返回列的数据类型名称,但可以通过查询数据字典视图来获取表中列的数据类型信息。以下是实现这一需求的方法及相关内容。 #### 使用 `USER_TAB_COLUMNS` 视图 Oracle 提供了系统数据字典视图 `USER_TAB_COLUMNS`,该视图存储了用户所有表的列定义信息,包括列名、数据类型等。通过查询此视图,可以获取表中各列的数据类型。 以下是一个示例查询语句: ```sql SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE_NAME'; ``` - `COLUMN_NAME`: 列名。 - `DATA_TYPE`: 数据类型[^3]。 - `DATA_LENGTH`: 数据长度(适用于字符类型)。 - `DATA_PRECISION`: 数值精度(适用于数字类型)。 - `DATA_SCALE`: 小数位数(适用于数字类型)。 #### 查询示例 假设有一个名为 `example_table` 的表,可以使用以下 SQL 查询其列的数据类型: ```sql SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EXAMPLE_TABLE'; ``` #### 关于 RAW 数据类型 如果需要特别关注 `RAW` 类型的数据列,可以结合条件过滤: ```sql SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE_NAME' AND DATA_TYPE = 'RAW'; ``` 这将返回指定表中所有 `RAW` 类型的列[^2]。 #### 日期类型查询 对于日期类型(如 `DATE` 和 `TIMESTAMP`),也可以通过类似方式查询: ```sql SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE_NAME' AND DATA_TYPE IN ('DATE', 'TIMESTAMP'); ``` 上述查询会返回表中所有日期和时间戳类型的列[^3]。 #### 动态 SQL 示例 如果需要动态生成查询语句,可以结合 PL/SQL 实现: ```plsql DECLARE v_sql VARCHAR2(1000); BEGIN v_sql := 'SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = :table_name'; EXECUTE IMMEDIATE v_sql INTO ... USING 'YOUR_TABLE_NAME'; END; ``` ### 总结 Oracle 数据库中并没有直接的函数用于查询数据类型,但可以通过查询系统视图 `USER_TAB_COLUMNS` 来获取表中列的数据类型信息。此方法涵盖了所有常见数据类型,包括字符串、数字、日期以及二进制类型如 `RAW`[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值