從一條sql報(bào)錯(cuò)解決過程學(xué)習(xí)程序員查bug的思路

從oracle遷移數(shù)據(jù)到達(dá)夢(mèng)后,發(fā)現(xiàn)數(shù)據(jù)庫默認(rèn)值都丟失了。于是我想從oracle數(shù)據(jù)庫將默認(rèn)值查出來,在達(dá)夢(mèng)數(shù)據(jù)庫加回去。
于是上網(wǎng)查了一下,看怎么獲取oracle數(shù)據(jù)庫字段默認(rèn)值信息,找到了這個(gè)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拿到數(shù)據(jù)庫跑時(shí)卻發(fā)現(xiàn)有問題,報(bào)了一個(gè)錯(cuò):

粗略掃了一下報(bào)錯(cuò)信息,沒看懂錯(cuò)在哪里。這跟我們平時(shí)碰上程序bug,但日志不清晰,看問題在哪是一樣的。
看了一下sql,主要有三部分,select,from語句(user_tab_cols是一個(gè)視圖),還有where條件,錯(cuò)誤可能是select部分,或者user_tab_cols視圖語句或者是where條件語句造成的,但不知道是哪一部分出錯(cuò)。
于是我先嘗試把where條件去掉,看還會(huì)不會(huì)報(bào)錯(cuò)。

結(jié)果還是一樣的錯(cuò),那說明錯(cuò)誤位置應(yīng)該不在where條件里面,那繼續(xù)嘗試縮小范圍。
這次我一步到位,把sql簡(jiǎn)化成只有一個(gè)元素:表名

發(fā)現(xiàn)可以查詢成功,那應(yīng)該在select語句里面。看查詢有多個(gè)字段,暫時(shí)不知道是哪個(gè)字段有問題,嘗試刪除后面一半。

這時(shí)發(fā)現(xiàn)問題還在,那應(yīng)該是前面兩個(gè)字段有問題。繼續(xù)刪除一個(gè)字段再試。

這時(shí)還是報(bào)錯(cuò),但錯(cuò)誤范圍已經(jīng)很小了。熟悉oracle的人一看就應(yīng)該能知道column是關(guān)鍵字,這里應(yīng)該是字段名寫錯(cuò)了。(后來發(fā)現(xiàn)正確字段名應(yīng)該是column_name)
如果這時(shí)還想不起來錯(cuò)誤原因怎么辦?——繼續(xù)刪減。看我下面的操作,刪除別名t

刪除到這里,發(fā)現(xiàn)還是報(bào)錯(cuò),但錯(cuò)誤提示不一樣了。這時(shí)再上網(wǎng)查一下,關(guān)于oracle的column信息,會(huì)在百度發(fā)現(xiàn)很多相關(guān)內(nèi)容。這時(shí)有一定編程經(jīng)驗(yàn)的人應(yīng)該肯定能回憶起來。

發(fā)現(xiàn)問題后,修改好,現(xiàn)在可以正常查出默認(rèn)值了。

這里展示了一種程序員查bug的思路,就是不斷減少可能導(dǎo)致報(bào)錯(cuò)的內(nèi)容,直到錯(cuò)誤不復(fù)現(xiàn)(或者錯(cuò)誤發(fā)生變化),問題足夠簡(jiǎn)單,可以一眼了然知道原因。
通過減少變量,逐步增加確定性,這是一種程序員查bug的思路。還有一種思路是倒過來,從一個(gè)最簡(jiǎn)的系統(tǒng),逐步增加變量,最近確定問題,以后有機(jī)會(huì)再分享案例。
出處:cnblogs.com/kingstarer/p/14897896.html
關(guān)注GitHub今日熱榜,專注挖掘好用的開發(fā)工具,致力于分享優(yōu)質(zhì)高效的工具、資源、插件等,助力開發(fā)者成長(zhǎng)!
點(diǎn)個(gè)在看,你最好看
