終於以一種奇怪的方式搞定了Oracle的暫存資料表問題

來源:互聯網
上載者:User
oracle|暫存資料表|問題
程式中常常需要在一個主鍵範圍內進行子查詢,而這個範圍是在前台中動態產生的,所以傳過來的只能是一個字串格式的確定這個主鍵範圍的sql語句.以前的做法是在sp中再根據這個sql語句拼出來返回最終結果的更大的語句.發現這樣子的語句往往效率很低,而且資料庫的改動(例如列名)也往往無法在包編譯時間被檢查出來.

解決的思路是先把這個主鍵範圍的值查詢出來,再用這個查詢的結果和其他的表作連結,這樣最終的sql就不再是字串格式了.因為主鍵範圍相對比較小,效率也會提高很多.

於是求助於Oracle的暫存資料表,這看起來是存放主鍵查詢結果的理想的地方. 首先想到的是事務型的,但是發現在前台的.Net程式執行了預存程序之後,預設執行了commit操作,所以返回的結果都是"對象已經不存在".還沒有搞懂遊標的返回機制,但這看起來有些釜底抽薪的意思.

因此轉而投奔會話型的,查詢的結果在事務完成後仍會予以保留,只要串連沒有斷調 -- 這在我們這個C/S架構的程式中是可以滿足的. 一個新的問題又出來的,就是如何保證兩次執行不會發生影響. 現在的做法是簡單的在每次執行前truncate掉暫存資料表,這樣,每一次執行時候,預存程序所看到的都是一張空表. 至此,大部分的問題便以這種頗為怪異的方式解決了.

但是問題仍然是有的.就是並發的問題.因為是C/S架構,當前每一個串連是局限在一個用戶端內,而在同一個用戶端產生這類並發的機會相對較小(不是沒有).剛剛想到一個可能的思路是每一次查詢完畢後,先去到資料,然後立即關閉串連,這樣暫存資料表中的資料就會被自動截斷.明天去試一試.

一段小插曲,一個哥們在網上搜oracle暫存資料表相關的材料,發給我一段類似下面的代碼:

declare @table1 Table (cust_id int not null)
insert into @table1 select cust_id from customer

總覺得看著眼熟,但是在oracle中怎麼編譯都不通過.一直到我把目光盯住了那個@ ..... 我終於明白了,這個是SqlServer中的代碼,ft啊,半年不用就退化到這個地步了




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.