Oracle
從 sys.ecol$ 中的 BINARYDEFVAL 列檢索日期列預設值
我正在嘗試從表中檢索列中的
BLOB
值。BINARYDEFVAL``sys.col$
表的 BINARYDEFVAL
sys.ecol$
以 BLOB 格式儲存預設列值。對於VARCHAR2
並且NUMBER
我能夠提取預設列值。但是,當我使用 DATE 列時,
utl_raw.cast_to_varchar2(dbms_lob.substr(BINARYDEFVAL))
我會得到一些亂碼,例如:)xv| (and some special characters
。雖然我可以看到一個這樣的列的預設值是預設值為 :
sysdate
。我認為這不是提取預設日期值的正確方法。
請告訴我如何解決這個問題。
正如已經說過的,使用
DBA_TAB_COLUMNS
.create table bp.t1 as select * from dba_objects; alter table bp.t1 add (d1 date default date'2018-06-13' not null); select * from ecol$; TABOBJ# COLNUM BINARYDEFVAL GUARD_ID ---------- ---------- --------------- ---------- 28857 27 7876060D010101 with function raw_to_date (p_raw raw) return date as l_date date; begin dbms_stats.convert_raw_value(p_raw, l_date); return l_date; end; select raw_to_date(dbms_lob.substr(binarydefval)) as date_value from ecol$; / DATE_VALUE ------------------- 2018-06-13 00:00:00
這不適用於
sysdate
,因為它返回添加列的時間。同時:
select data_default from dba_tab_columns where table_name = 'T1' and column_name = 'D1'; DATA_DEFAULT -------------------------------------------------------------------------------- date'2018-06-13'
與其依賴可能發生變化的 Oracle 內部結構,正確的方法是使用
DBA_TAB_COLUMNS
數據字典視圖,特別是DATA_DEFAULT
列。文件在這裡。