我正在使用包含raw(200)字段的表。从我的客户端应用程序中,我设法获取值并将其存储在byte []中,以便我可以遍历它并获取所有样本。
我的原始数据就像......
2C2B2E2B2D2C2933283030332B2F2D302F2B272F312E2B2F2F28242A2F322E
...从那里我想从十六进制到十进制值并得到一个数组,如44,43,46,43
但是,我想在程序中做类似的事情,但我不知道如何迭代原始字段或如何将其转换为字节数组。
我试过UTL_RAW.CAST_TO_BINARY_INTEGER,但那只会给我第一个样本
答案 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
将每个子字符串转换为十进制