2010-11-08 51 views
4

我對sybase有很好的經驗,並且已經開始在空閒時間查看oracle。 我使用的大多數sybase過程都有臨時表,加入兩個或更多臨時表可以獲得結果集。在oracle中加入遊標或記錄集

問題: 有沒有辦法像邏輯表一樣連接兩個或多個光標。

喜歡的東西:

SELECT c1.id, 
     c2.name 
    FROM cursorEmp c1, 
     CursorDept c2 
WHERE c1.DeptId = c2.DeptId 
+1

什麼版本的Oracle? IME(oracle 10g),你不能加入遊標(隱式,顯式或REFCURSORS)。有關遊標封裝的更多信息,很可能根本不需要遊標(或臨時表)。 – 2010-11-08 03:58:02

+0

Oracle 11g版本。 – 2010-11-08 04:39:07

回答

8

你無法加入兩個光標,沒有。

你可以,當然,結合兩個基本的查詢,即

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中,因爲讀者不會阻止作家(反之亦然),這是非常很少需要使用臨時表。通常情況下,您只需使用視圖查詢基礎表,以提供適當的抽象級別。

+0

謝謝Justin,但是,「讀者不會阻止作者」是什麼意思?當選擇被執行時,不會將該記錄鎖定在讀取(共享)模式下,拒絕獨佔鎖定寫入器進程。 – 2010-11-08 04:46:10

+5

SELECT不會採取任何鎖定(除非您執行SELECT ... FOR UPDATE)。要停止選擇讀取未提交的更改,它會使用類似時間戳(SCN)的內容,並在鎖定之前查找該行的歷史副本。 – 2010-11-08 05:11:28

+0

謝謝Gary,我對這個主題做了一些閱讀,看起來像共享鎖定更像是一個sybase功能。我現在有更多的問題,但在問問題之前讓我先搜索一下。 – 2010-11-08 16:48:09

0

Oracle確實有自己的臨時表版本(在事務或會話期間存儲臨時數據的永久性結構) - 您可以考慮使用這些臨時表,儘管(如Justin建議的),您也可以將兩者底層查詢。

+0

謝謝Mark,我知道Global Temporary Tables。但我覺得他們可能會混淆數據庫。你對此有何想法?我現在有更多關於觀點的問題,我有時間閱讀更多內容。 – 2010-11-08 16:52:27

+0

我還沒有使用太多的Oracle臨時表,但之後我沒有在需要在大量使用臨時表的SQLServer過程和Oracle過程之間轉換的環境中工作。我偶爾會在沒有實際選擇的情況下使用它們,但更頻繁地運行聯合查詢,並根據需要進行提示。 – 2010-11-08 17:43:42