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 with
或 prior
的情况下 connect by
是如何工作的。
在一些有针对性的谷歌搜索后找到了一个很好的解释:orafaq.com/wiki/…【参考方案2】:
可能有一种更有效的方法来解决这个问题,但我设法通过在我的原始数据上使用 utl_raw.length 和 utl_raw.substr 并使用标准 plsql 循环并使用 utl_raw.cast_to_binary_integer
将每个子字符串转换为十进制【讨论】:
以上是关于oracle 原始类型迭代的主要内容,如果未能解决你的问题,请参考以下文章