2014-05-25 3 views
1

raw (200) 필드가 포함 된 테이블을 사용하고 있습니다. 클라이언트 응용 프로그램에서 값을 가져 와서 바이트 []에 저장할 수 있으므로 루프를 반복하여 모든 샘플을 가져올 수 있습니다. 내 원시 데이터가 같은 것oracle 원시 유형 반복

...

2C2B2E2B2D2C2933283030332B2F2D302F2B272F312E2B2F2F28242A2F322E 

... 내가 값을 진수 진수로 가서 배열을 좀하고 싶습니다 거기에서 같은 44,43,46,43

그러나 절차에서 비슷한 일을하고 싶지만 원시 필드를 반복하는 방법이나 바이트 배열로 변환하는 방법을 모르겠습니다.

나는 UTL_RAW.CAST_TO_BINARY_INTEGER과 노력하지만 단지 나에게 첫 번째 샘플

+0

데이터 및 원하는 출력? – APC

+0

내 원시 데이터는 다음과 같을 것입니다 : 2C2B2E2B2D2C2933283030332B2F2D302F2B272F312E2B2F2F28242A2F322E ... 거기에서 16 진수 값으로 이동하여 44,43,46,43과 같은 배열을 얻고 싶습니다. – Valkyrie

답변

1

와 진수로 각각의 문자열을 변환

,369
SQL> select col1 
    2 from t23 
    3/

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


SQL> 

... 필요한 출력을 생성이 같은 SELECT ... 진수로 진수로 변환 할 수있는 'XX'마스크

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 ...

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

이 접근법은 믿을 수 없을만큼 재미 있습니다 ... 나는이 방법에 대한 설명을보고 싶습니다. 특히 '시작'또는 '이전'없이 '연결'이 어떻게 작동 하는지를 알고 싶습니다. – Andy

+0

일부 Google 검색 결과에 대한 훌륭한 설명을 찾았습니다. http://www.orafaq.com/wiki/Oracle_Row_Generator_Techniques#CONNECT_BY_LEVEL – Andy

0

을 줄 것입니다 아마이 문제를 해결하기 위해보다 효율적인 방법이 있지만 utl_raw.lengthutl_raw를 사용하여 내 결과를 얻을 수 있었다. 내 원시 데이터에 SUBSTR 및 ... 표준 PLSQL 루프로 반복하고 utl_raw.cast_to_binary_integer이 데이터를 감안할 때