標籤:
就是6張表的關聯查詢,寫了一個預存程序,使用4層for來處理
bug:
最後一個for中,兩張表的關聯條件少了一個,結果資料多查了。
排查辦法:
使用dbms_output.printline(‘‘);
每一個for中加一個
dbms_output.put_line(‘-3、‘||x.name);//把與下層for關聯的關鍵資訊列印出來
dbms_output.put_line(‘-2、‘||x.name);//把與下層for關聯的關鍵資訊列印出來
dbms_output.put_line(‘-1、‘||x.name);//把與下層for關聯的關鍵資訊列印出來
dbms_output.put_line(‘0、‘||x.name);//把與下層for關聯的關鍵資訊列印出來
然後,就順藤摸瓜了。
然後在Commnad Window中調用這個預存程序,拿到列印資訊
SQL> set serveroutput onSQL> exec sum_num(3,1256);
總結:
功能一直要仔細驗證,不同角度可以發現問題
要用dbms_output.put_line來輸出語句,遇到以下錯誤:
begin user_priv (username => ‘hr‘); end;
ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 97
ORA-06512: at "SYS.DBMS_OUTPUT", line 112
ORA-06512: at "HR.USER_PRIV", line 20
ORA-06512: at line 2
很顯然當我們在輸出時,控制輸出結果的緩衝大小由DBMS_OUTPUT.ENABLE控制,buffer size預設為20000,每行最大的限制是32k,後面的一個例子是用來說明預存程序是在緩衝了所有資料後才將結果返回。所以當我們使用遊標進行輸出時,如果結果很多,將會超過這個值報ORA-20000, ORU-10027: Buffer overflow, limit of <buf_limit> bytes這個錯誤
解決方案:
在預存程序begin後面加 : DBMS_OUTPUT.ENABLE (buffer_size=>null) 表示沒有限制.
預存程序user_priv 請參考文檔:http://www.cnblogs.com/AlbertCQY/archive/2013/03/31/2992471.html
http://blog.csdn.net/u010033674/article/details/8744588
表與表的關係把RD搞亂了,記一個Procedure中的bug