Oracle外部表學習及Ora-01846問題

regonly1發表於2008-12-19


create or replace directory data_dir as '/oracle/oracle9i/admin/boss/bdump/'

create table alert_log ( text_line varchar2(255))
organization external(
    type oracle_loader
    default directory data_dir
    access parameters(
          records delimited by newline
          fields
          reject rows with all null fields
     )
     location (
              'alert_boss.log'
     )
)reject limit unlimited

select to_char(last_time, 'yyyy-mm-dd hh24:mi:ss') shutdown,
    to_char(start_time, 'yyyy-mm-dd hh24:mi:ss') startup,
    round((start_time - last_time) * 24 * 60, 2) mins_down,
    round((last_time - lag(start_time) over(order by r)), 2) days_up,
    case when (lead(r) over(order by r) is null) then
     round((sysdate - start_time), 2)
    end days_still_up
  from (select r,
      to_date(last_time, 'Dy Mon DD HH24:MI:SS YYYY') last_time,
          to_date(start_time, 'Dy Mon DD HH24:MI:SS YYYY') start_time    --select *
          from (select r,
        text_line,
        lag(text_line, 1) over(order by r) start_time,
        lag(text_line, 2) over(order by r) last_time
      from (select rownum r, text_line
        from alert_log
       where text_line like '___ ___ __ __:__:__ 20__'
       or text_line like 'Starting ORACLE instance %'
)
)
   where text_line like 'Starting ORACLE instance %'
)    
執行如上語句時出現:Ora-01846: not a valid day of the week 錯誤
從最內層開始檢查(綠色部分),沒有問題;
檢查第二層(黑色部分),沒有問題;
第三層(紅色部分),這個問題出現了。檢查具體的資料,發現“Mon Jan 21 13:25:47 2008”
是符合to_date()的格式轉換要求的,但是為什麼這裡就報錯了呢。
嘗試以單個轉換的方式來檢查:
select to_date('Mon Jan 21 13:25:47 2008', 'dy mon dd hh24:mi:ss yyyy') from dual
結果還是報錯,不大明白是什麼原因了。
於是檢查當前環境:
select to_date(sysdate, 'dy mon dd hh24:mi:ss yyyy') from dual
結果出現的是中文的字元日期,如下:星期五 12月 19 13:53:15 2008
難怪他老是報錯呢,原來是字符集的問題,於是:
alter session set nls_date_language = 'American'
再次執行前面的SQL語句,果然搞定。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-517455/,如需轉載,請註明出處,否則將追究法律責任。

相關文章