從一條sql報錯解決過程學習程式設計師查bug的思路

皇家救星發表於2021-06-18

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

相關文章