存储过程:光标坏了?

时间:2012-06-05 21:42:12

标签: oracle stored-procedures plsql cursor

我在某处读到了99%的时间你不需要使用游标。

但在以下情况下,除了使用游标之外,我无法想到任何其他方式。

Select t.flag
From Dual t; 

让我们说这会返回4行'Y''N'。如果找到'Y',我希望该过程触发某些内容。我通常声明一个游标并循环直到%NOTFOUND。请告诉我是否有更好的方法。

另外,如果您有任何想法,何时是使用光标的最佳时间?

编辑:如果我想做"如果'Y'然后触发某些内容" , ,而不是插入标志? p>

4 个答案:

答案 0 :(得分:2)

这样的事情:

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

使用基于集合而不是过程操作时,通常会看到性能提升,因为大多数现代DBMS都设置为执行基于集合的操作。您可以阅读更多here

答案 1 :(得分:2)

你的案件肯定属于99%。

您可以使用insert into ... select...轻松完成条件插入。这只是一个问题,或者使select返回您想要插入的结果。

如果要为每个'Y'插入一条记录,请使用where flag = 'Y'的查询。如果您只想根据是否至少有一个'Y'插入单个记录,则可以向查询添加distinct

当你制作更复杂的东西时,光标很有用。例如,我需要在一个表中插入或更新记录时使用游标,并且还为每个记录插入或将一个或多个记录更新到其他几个表中。

答案 2 :(得分:1)

嗯,这个例子没有多大意义..

但你总是可以写一个insert as select语句,而不是我认为你在描述的语句

答案 3 :(得分:0)

当在一个表中的列值将在不同表的多个查询中重复使用时,最好使用游标。

假设使用游标CUR_TEST从MY_TEST_TBL获取id_test列的值。现在这个id_test列是MY_TEST_TBL中的外键。如果我们想使用id_test插入或更新表A_TBL,B_TBL和C_TBL中的任何行,那么在这种情况下,最好使用游标而不是使用复杂查询。

希望这可能有助于理解游标的目的