logmnr で hextoraw 先が DATE型列の時の変換方法適当版
ちょっと諸事情でディクショナリ情報を取れない状況で LOGMNR して追っていくときに、DATE型へ入れているところを変換したかったのでやっつけで探したという話。
オブジェクトID は、とりあえず dba_objects を取れば分かるので、後は SQL_REDO列を見ていくわけですが…。
他に簡単なやり方があったら是非知りたい!!
結論としては HEXTORAW('7871061d062701') な感じで見えたので、後はデータフォーマット仕様にあわせて逆変換しましょうということです。
データフォーマット仕様は SHIFT-THE-ORACLE さんが良い感じ。
で、結果こうなる。
■DATE型簡易変換
CREATE OR REPLACE Procedure HEXTODATE(P_HEX IN VARCHAR2) AS vHexYearY NUMBER; vHexYearR NUMBER; vHexMonth NUMBER; vHexDay NUMBER; vHexHour NUMBER; vHexMin NUMBER; vHexSec NUMBER; BEGIN vHexYearY := to_number(SUBSTR(P_HEX,1,2),'XXX') - 100 ; vHexYearR := to_number(SUBSTR(P_HEX,3,2),'XXX') - 100 ; vHexMonth := to_number(SUBSTR(P_HEX,5,2),'XX'); vHexDay := to_number(SUBSTR(P_HEX,7,2),'XX'); vHexHour := to_number(SUBSTR(P_HEX,9,2),'XX') - 1 ; vHexMin := to_number(SUBSTR(P_HEX,11,2),'XX') - 1 ; vHexSec := to_number(SUBSTR(P_HEX,13,2),'XX') - 1 ; DBMS_OUTPUT.PUT_LINE('result = ' || vHexYearY||vHexYearR||'/'||vHexMonth||'/'||vHexDay||' '||vHexHour||':'||vHexMin||':'||vHexSec); END; / set serveroutput on exec hextodate('7871061d062701'); result = 2013/6/29 5:38:0
■varchar/numberは面倒だけどこんな感じで
select UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('78')) from dual; select UTL_RAW.CAST_TO_NUMBER(HEXTORAW('78')) from dual;
しかし、timestampってどーすんだろ…。
※参考
http://www.shift-the-oracle.com/element/data-type/data-type-inside.html