2009-05-04 33 views
5

我曾與SQL現在最近工作了好幾年,主要的MySQL/phpMyAdmin的,而且甲骨文/ ISQLPLUS和PL/SQL。我用PHP,Java,ActionScript等編程。我知道SQL不是命令式編程語言和別人一樣 - 但爲什麼這些錯誤信息似乎在SQL少了這麼多具體?在其他環境中,我直指問題的根源。更常見的是,MySQL給了我錯誤,如「錯誤在哪裏u.id = ...」,並打印整個查詢。存儲過程對於調試可能是一個完整的噩夢更加困難。有沒有更好的方法來調試SQL?

我錯過了一個神奇的工具/語言/插件/設置,提供更好的錯誤報告,或者我們堅持這樣嗎?我希望有一個調試器或語言,給了我相同的控制量的Eclipse設置斷點和步進低谷代碼時給我。這可能嗎?

+5

聽起來像一個投訴比一個適當的問題更多。你想要一個更好的調試器嗎?你想要一個更好的數據庫嗎?你想要修復什麼?哪些代碼不起作用? – 2009-05-04 18:06:48

回答

5

我認爲答案在於SQL是一種基於集合的語言,附帶一些程序性的東西。由於設計人員以集合術語思考,他們並不認爲其他語言具有的普通類型的調試很重要。不過,我認爲其中一些正在改變。您可以在SQL Server 2008中設置斷點。我還沒有真正使用它,因爲您必須擁有SQL Server 2008數據庫才能工作,而且我們大部分數據庫仍然是SQL Server 2000.但它是可用的,它確實允許您逐步完成的東西。當您的select語句長度爲150行時,您仍然會遇到問題,並且它知道語法不正確,但它不能指出所有命令的確切位置。

就我個人而言,當我編寫一個長程序SP時,我建立了一個測試模式,包括向我展示我做的事情的結果,我感興趣的特定點的關鍵變量的值,以及打印讓我知道哪些步驟已經完成,然後在完成時將整個事情回滾。這樣,我可以看到,如果它真正運行會發生什麼事情,但不是在數據庫中有傷害的任何數據,如果我聽錯了。我覺得這非常有用。它可以大大增加你的proc的大小。我有一個我使用的模板,它具有我需要設置的大部分結構,所以它不需要太長的時間。特別是因爲我從不添加插入。更新或刪除到一個proc,而無需首先測試相關的選擇,以確保我有我想要的記錄。

1

我同意您的投訴。

建立一個良好的日誌框架,並在您的存儲過程過度使用是什麼最適合我。

在每次事務或重要的邏輯之前和之後,我會在日誌表中寫出sproc名稱,步驟時間戳和行計數(如果相關)。我發現當我這樣做時,我通常可以在幾分鐘內縮小問題範圍。

向sproc添加一個調試參數(默認爲「N」)並將其傳遞給其調用的任何其他sprocs,以便您可以輕鬆地打開或關閉日誌記錄。

3

我認爲解釋是「常規」語言比SQL有更小的單個語句,因此單語句粒度指向它們中比SQL更小的一部分代碼。單個SQL語句可以是一頁或更多頁面;在其他語言中通常是單行。

我不認爲這會讓調試器/ IDE無法更精確地識別錯誤,但我懷疑它會讓它更難。

1

至於斷點和單步執行代碼,你可以使用MS SQL Server來做到這一點(在我看來,2005年比2000年更容易)。

對於簡單的情況,早期的開發調試,有時神祕的消息通常足以讓錯誤得到解決 - 語法錯誤,不能用X做X.如果我處在一個棘手的問題中,將會恢復到sproc文本中的「printf調試」,因爲它很快捷。經過一段時間你的數據庫的選擇,簡單的問題成爲老帽子,你只是採取他們的步伐。

但是,一旦代碼被髮布,問題的複雜性就太高了。如果我能夠複製它們,我認爲自己很幸運。另外,我的開發人員想要調試器的地方是我的DBA說:「沒有辦法在那裏放置一個調試器。」

0

我的確使用以下策略。

在寫入存儲過程期間,每次執行一個新的邏輯步時,都會有一個@procStep var set @procStep =「這裏發生了什麼......」;

剩下的就是here

相關問題