Oracle

從 sys.ecol$ 中的 BINARYDEFVAL 列檢索日期列預設值

  • January 25, 2022

我正在嘗試從表中檢索列中的BLOB值。BINARYDEFVAL``sys.col$

表的 BINARYDEFVALsys.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列。

文件在這裡

引用自:https://dba.stackexchange.com/questions/209393