2012-06-05 138 views
3

我在某處讀到99%的時間你不需要使用遊標。存儲過程:光標不好?

但我想不出在這種情況下使用遊標的其他方式。

Select t.flag 
From Dual t; 

比方說,這回4行要麼'Y''N'的。如果發現'Y',我希望程序觸發某些內容。我通常會聲明一個遊標並循環,直到%NOTFOUND。請告訴我,如果有更好的方法。

此外,如果您有任何想法,什麼時候使用光標的最佳時機?

編輯:除了插入標誌的,如果我想要做什麼「如果'Y'然後觸發一些」

+0

http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

+0

http://stackoverflow.com/questions/1479680/ms-sql-server -when-a-cursor-good/1479751#1479751 – HLGEM

+1

在你的查詢中添加一個'where t.flag ='Y''? ...MySQL INSERT INTO tbl_flag()VALUES()WHERE(SELECT COUNT(*)FROM Dual t其中t.flag ='Y')> 1' –

回答

2

您的情況絕對屬於99%。

您可以使用insert into ... select...輕鬆完成條件插入。這只是一個問題或使select返回你想要插入的結果。

如果要爲每個'Y'插入一條記錄,請使用帶有where flag = 'Y'的查詢。如果您只想插入單個記錄,具體取決於是否至少有一個'Y',則可以將distinct添加到查詢中。

當你做出更復雜的事情時,光標很有用。例如,我需要在需要插入或更新一個表中的記錄時使用遊標,並且還爲每個記錄插入或更新一個或多個記錄到其他幾個表中。

+0

如何觸發某些東西?如果它發現'Y',那麼創建一些值或者做些什麼? – sayhaha

+0

@sayhaha:然後你可以使用'if exists(select * from Dual where Flag ='Y')''。 – Guffa

1

很好的例子犯規頗有道理..

但你總是可以寫一個insert as select語句而不是什麼我想你所描述

2

事情是這樣的:

INSERT INTO TBL_FLAG (col) 
SELECT ID FROM Dual where flag = 'Y' 

你會通常在使用基於集合而不是程序操作時會看到性能增益,因爲大多數現代DBMS都設置爲執行基於集合的操作。你可以閱讀更多here

+0

如何觸發的東西?如果它發現'Y',那麼創建一些值或者做些什麼? – sayhaha

+0

我不完全確定你在問什麼,但在這種情況下觸發器不是你所需要的。 –

+0

:p對不起讓我們說如果我運行select * from dual;它返回4行{'Y','N','N','Y'}然後,由於系統發現'Y'我想查詢TABLE1中的值並將其放入TABLE2中。 – sayhaha

0

當一個表的列值將被重複用於不同表上的多個查詢時,最好使用遊標。

假設使用遊標CUR_TEST從MY_TEST_TBL獲取id_test列的值。現在這個id_test列是MY_TEST_TBL中的外鍵。如果我們想使用id_test插入或更新表A_TBL,B_TBL和C_TBL中的任何行,那麼在這種情況下,最好使用遊標而不是使用複雜查詢。

希望這可能有助於瞭解光標的目的