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