oracle raw类型迭代

时间:2014-05-25 16:17:01

标签: oracle loops plsql raw-types

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

我的原始数据就像......

2C2B2E2B2D2C2933283030332B2F2D302F2B272F312E2B2F2F28242A2F322E

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

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

我试过UTL_RAW.CAST_TO_BINARY_INTEGER,但那只会给我第一个样本

2 个答案:

答案 0 :(得分: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与&#39; XX&#39;掩码将十六进制转换为十进制...

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;
/

答案 1 :(得分:0)

可能有更好的方法来解决这个问题,但我设法通过对原始数据使用 utl_raw.length utl_raw.substr 来获得我的结果使用标准plsql循环进行迭代,并使用 utl_raw.cast_to_binary_integer

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