我對sybase有很好的經驗,並且已經開始在空閒時間查看oracle。 我使用的大多數sybase過程都有臨時表,加入兩個或更多臨時表可以獲得結果集。在oracle中加入遊標或記錄集
問題: 有沒有辦法像邏輯表一樣連接兩個或多個光標。
喜歡的東西:
SELECT c1.id,
c2.name
FROM cursorEmp c1,
CursorDept c2
WHERE c1.DeptId = c2.DeptId
我對sybase有很好的經驗,並且已經開始在空閒時間查看oracle。 我使用的大多數sybase過程都有臨時表,加入兩個或更多臨時表可以獲得結果集。在oracle中加入遊標或記錄集
問題: 有沒有辦法像邏輯表一樣連接兩個或多個光標。
喜歡的東西:
SELECT c1.id,
c2.name
FROM cursorEmp c1,
CursorDept c2
WHERE c1.DeptId = c2.DeptId
你無法加入兩個光標,沒有。
你可以,當然,結合兩個基本的查詢,即
SELECT c1.id,
c2.name
FROM (SELECT * FROM emp WHERE ename = 'KING') c1,
(SELECT * FROM dept WHERE dname = 'ACCOUNTING') c2
WHERE c1.DeptID = c2.DeptID
在Oracle中,因爲讀者不會阻止作家(反之亦然),這是非常很少需要使用臨時表。通常情況下,您只需使用視圖查詢基礎表,以提供適當的抽象級別。
謝謝Justin,但是,「讀者不會阻止作者」是什麼意思?當選擇被執行時,不會將該記錄鎖定在讀取(共享)模式下,拒絕獨佔鎖定寫入器進程。 – 2010-11-08 04:46:10
SELECT不會採取任何鎖定(除非您執行SELECT ... FOR UPDATE)。要停止選擇讀取未提交的更改,它會使用類似時間戳(SCN)的內容,並在鎖定之前查找該行的歷史副本。 – 2010-11-08 05:11:28
謝謝Gary,我對這個主題做了一些閱讀,看起來像共享鎖定更像是一個sybase功能。我現在有更多的問題,但在問問題之前讓我先搜索一下。 – 2010-11-08 16:48:09
Oracle確實有自己的臨時表版本(在事務或會話期間存儲臨時數據的永久性結構) - 您可以考慮使用這些臨時表,儘管(如Justin建議的),您也可以將兩者底層查詢。
謝謝Mark,我知道Global Temporary Tables。但我覺得他們可能會混淆數據庫。你對此有何想法?我現在有更多關於觀點的問題,我有時間閱讀更多內容。 – 2010-11-08 16:52:27
我還沒有使用太多的Oracle臨時表,但之後我沒有在需要在大量使用臨時表的SQLServer過程和Oracle過程之間轉換的環境中工作。我偶爾會在沒有實際選擇的情況下使用它們,但更頻繁地運行聯合查詢,並根據需要進行提示。 – 2010-11-08 17:43:42
什麼版本的Oracle? IME(oracle 10g),你不能加入遊標(隱式,顯式或REFCURSORS)。有關遊標封裝的更多信息,很可能根本不需要遊標(或臨時表)。 – 2010-11-08 03:58:02
Oracle 11g版本。 – 2010-11-08 04:39:07