從oracle遷移資料到達夢后,發現資料庫默認值都丟失了,于是我想從oracle資料庫將默認值查出來,在達夢資料庫加回去,
于是上網查了一下,看怎么獲取oracle資料庫欄位默認值資訊,找到了這個sql,
select t.column, t.data_type, t.data_length, t.nullable, t.data_default from USER_TAB_COLS t where TABLE_NAME = 'AA'
但把sql拿到資料庫跑時卻發現有問題,報了一個錯:

粗略掃了一下報錯資訊,沒看懂錯在哪里,這跟我們平時碰上程式bug,但日志不清晰,看問題在哪是一樣的,
看了一下sql,主要有三部分,select,from陳述句(user_tab_cols是一個視圖),還有where條件,錯誤可能是select部分,或者user_tab_cols視圖陳述句或者是where條件陳述句造成的,但不知道是哪一部分出錯,
于是我先嘗試把where條件去掉,看還會不會報錯,

結果還是一樣的錯,那說明錯誤位置應該不在where條件里面,那繼續嘗試縮小范圍,
這次我一步到位,把sql簡化成只有一個元素:表名

發現可以查詢成功,那應該在select陳述句里面, 看查詢有多個欄位,暫時不知道是哪個欄位有問題,嘗試洗掉后面一半,

這時發現問題還在,那應該是前面兩個欄位有問題,繼續洗掉一個欄位再試,

這時還是報錯,但錯誤范圍已經很小了,熟悉oracle的人一看就應該能知道column是關鍵字,這里應該是欄位名寫錯了,(后來發現正確欄位名應該是column_name)
如果這時還想不起來錯誤原因怎么辦?——繼續刪減,看我下面的操作,洗掉別名t

洗掉到這里,發現還是報錯,但錯誤提示不一樣了,這時再上網查一下,關于oracle的column資訊,會在百度發現很多相關內容,這時有一定編程經驗的人應該肯定能回憶起來,

發現問題后,修改好,現在可以正常查出默認值了,

這里展示了一種程式員查bug的思路,就是不斷減少可能導致報錯的內容,直到錯誤不復現(或者錯誤發生變化),問題足夠簡單,可以一眼了然知道原因,
通過減少變數,逐步增加確定性,這是一種程式員查bug的思路,還有一種思路是倒過來,從一個最簡的系統,逐步增加變數,最近確定問題,以后有機會再分享案例,
留一個小思考題:如果第一步洗掉了where條件后,發現sql不報錯了,應該怎么查?
如果發現只有where條件跟select欄位同時保留才報錯,單獨修改欄位或者洗掉where條件不報錯,又該怎么查?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/308496.html
標籤:Oracle
