oracle 原始类型迭代

Posted

技术标签:

【中文标题】oracle 原始类型迭代【英文标题】:oracle raw type iteration 【发布时间】:2014-05-25 16:17:01 【问题描述】:

我正在处理一个包含 raw(200) 字段的表。从我的客户端应用程序中,我设法获取值并将其存储在 byte[] 中,这样我就可以遍历它并获取所有样本。

我的原始数据会是……

2C2B2E2B2D2C2933283030332B2F2D302F2B272F312E2B2F2F28242A2F322E

...从那里我想从十六进制值转到十进制值并获得一个数组,例如 44,43,46,43

但是,我想在过程中做类似的事情,但我不知道如何迭代原始字段或如何将其转换为字节数组。

我尝试使用 UTL_RAW.CAST_TO_BINARY_INTEGER 但这只会给我第一个样本

【问题讨论】:

您能否发布一份数据样本和您想要的输出? 我的原始数据如下: 2C2B2E2B2D2C2933283030332B2F2D302F2B272F312E2B2F2F28242A2F322E... 从那里我想从十六进制值转到十进制值并获得一个数组,例如 44,43,46,43,... 【参考方案1】:

鉴于这些数据...

SQL> select col1
  2  from t23
  3  /

COL1
--------------------------------------------------------------------------------
32433242324532423244324332393333323833303330333332423246324433303246324232373246
33313245324232463246323832343241324633323245


SQL>

...这样的 SELECT 将产生必要的输出...

SQL> select regexp_substr(utl_raw.cast_to_varchar2(col1), '([A-Z0-9]2)', 1, level)
  2  from t23
  3  connect by level <= ceil(utl_raw.length(col1)/2)
  4  /

REGEXP_SUBSTR(UTL_RAW.CAST_TO_VARCHAR2(COL1),'([A-Z0-9]2)',1,LEVEL)
--------------------------------------------------------------------------------
2C
2B
2E
2B
...
2B
2F
2F
28
24
2A
2F
32
2E

31 rows selected.

SQL> 

使用 TO_NUMBER 和 'XX' 掩码将十六进制转换为十进制 ...

SQL> select to_number(
  2      regexp_substr(utl_raw.cast_to_varchar2(col1), '([A-Z0-9]2)', 1, level)
  3          , 'XX')
  4  from t23
  5  connect by level <= ceil(utl_raw.length(col1)/2)
  6  /

TO_NUMBER(REGEXP_SUBSTR(UTL_RAW.CAST_TO_VARCHAR2(COL1),'([A-Z0-9]2)',1,LEVEL),
--------------------------------------------------------------------------------
                                                                              44
                                                                              43
                                                                              46
                                                                              43
                                                                              45
                                                                              44
                                                                              41
...

最后,填充一个数组,并使用批量集合语法在 PL/SQL 中填充它:

create type int_nt as table of integer
/

declare
    ints int_nt;
begin
  select to_number(
          regexp_substr(utl_raw.cast_to_varchar2(col1), '([A-Z0-9]2)', 1, level)
             , 'XX')
  bulk collect into ints
  from t23
  connect by level <= ceil(utl_raw.length(col1)/2);
end;
/

【讨论】:

这种方法对我来说非常有趣...我很想看到这种方法的解释,尤其是在没有 start withprior 的情况下 connect by 是如何工作的。 在一些有针对性的谷歌搜索后找到了一个很好的解释:orafaq.com/wiki/…【参考方案2】:

可能有一种更有效的方法来解决这个问题,但我设法通过在我的原始数据上使用 utl_raw.lengthutl_raw.substr 并使用标准 plsql 循环并使用 utl_raw.cast_to_binary_integer

将每个子字符串转换为十进制

【讨论】:

以上是关于oracle 原始类型迭代的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 长原始问题

查询长原始数据类型

std::sort 如何修改后备类型?

java 中的原始类型与原始封装类型

高频面试题—“原始类型与引用类型”

C ++中的原始类型与C中的原始类型[重复]