從一條sql報錯解決過程學習程序員查bug的思路

從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條件不報錯,又該怎麼查?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章