天天看點

從臨時表傳回資料時遇到的問題(ORA-08103: object no longer exists)

  寫個存儲過程向臨時表中插入資料,并從臨時表中傳回資料,在PL/SQL Developer中測試沒問題,但用ASP.NET應用程式擷取資料時出現:ORA-08103: object no longer exists  錯誤提示。

  後來,把臨時表的建立選項由on commit delete rows改為on commit preserve rows;  解決!

  但是,問題總出在“但是”上 :)

  在ASP.Net頁中查詢臨時表資料時,每查一次都要多出一些重複記錄,原因肯定是Oracle的會話連接配接沒有結束,導緻每次執行存儲過程都要先插入記錄。Oracle會話為什麼沒有結束,肯定是ASP.NET服務程式在資料連接配接池中保持着與資料庫的連接配接。但是為了性能我們也不能不用連接配接池。這樣基于Oracle 會話的臨時表是不能用了。

  

  重新回到基于Oracle事務的臨時表,也就是臨時表的建立選項用on commit delete rows。然後,在ASP.Net應用程式中調用ODP自身的事務處理機制,問題得以解決!

  注:

  (1)理論上,不要在存儲過程中執行Commit,即不要在存儲過程中使用PL/SQL的事務處理, 否則ASP.NET頁面也無法得到資料,因為commit 後,臨時表中資料會自動清空。

  (2)理論上,不用ODP的話,用OLEDB或微軟提供的ORACLE事務處理機制應該也可以,我沒有測試。