2012-06-05 65 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中的任何行,那么在这种情况下,最好使用游标而不是使用复杂查询。

希望这可能有助于了解光标的目的