使用游标处理存储过程中表中的每一行

Posted

技术标签:

【中文标题】使用游标处理存储过程中表中的每一行【英文标题】:process each row in table in stored procedure using cursor 【发布时间】:2012-09-29 07:50:43 【问题描述】:

我的场景有点不同。我在存储过程中所做的是

使用“光标”创建临时表并在其中插入行

Create Table #_tempRawFeed
    (
    Code            Int Identity,
    RawFeed         VarChar(Max)
    )

使用游标在临时表中插入数据

 Set @GetATM = Cursor Local Forward_Only Static For
    Select DeviceCode,ReceivedOn
    From RawStatusFeed
    Where C1BL=1 AND Processed=0
    Order By ReceivedOn Desc
Open @GetATM
Fetch Next
From @GetATM Into @ATM_ID,@Received_On
While @@FETCH_STATUS = 0
    Begin
        Set @Raw_Feed=@ATM_ID+' '+Convert(VarChar,@Received_On,121)+' '+'002333'+' '+@ATM_ID+' : Bills - Cassette Type 1 - LOW '
        Insert Into #_tempRawFeed(RawFeed) Values(@Raw_Feed)
        Fetch Next
        From @GetATM Into @ATM_ID,@Received_On
    End

现在必须使用另一个光标处理临时表中的每一行

DECLARE @RawFeed    VarChar(Max)

DECLARE Push_Data CURSOR FORWARD_ONLY LOCAL STATIC
FOR SELECT RawFeed
FROM #_tempRawFeed

OPEN Push_Data
FETCH NEXT FROM Push_Data INTO @RawFeed

WHILE @@FETCH_STATUS = 0
BEGIN
    /* 
    What Should i write here to retrieve each row one at a time ??
    One Row should get stored in Variable..in next iteration previous value should get deleted.
    */
    FETCH NEXT FROM Push_Data INTO @RawFeed 
END
CLOSE Push_Data
DEALLOCATE Push_Data

Drop Table #_tempRawFeed    

我应该在 BEGIN 中写什么来一次检索每一行? 一行应该存储在变量中。在下一次迭代中,前一个值应该被删除。

【问题讨论】:

“但问题是它无法正常工作”是什么意思。它做错了什么? 在开始迭代之前,您是否检查过#_tempRawFeed 表中确实存在行?如果表中没有行,则无法迭代任何内容... “我的场景有点不同”,有什么不同?可能是另一个问题?然后发布该问题的链接。 临时表包含数据 向我们展示如何将数据放入临时表中 【参考方案1】:

关于您的最后一个问题,如果您真正打算在最后一个游标中执行的操作是将 RawFeed 列值连接到一个变量中,那么您根本不需要游标。您可以使用以下内容(改编自您的 SQL Fiddle 代码):

CREATE TABLE #_tempRawFeed
(
   Code            Int IDENTITY
   RawFeed         VarChar(MAX)
)

INSERT INTO #_tempRawFeed(RawFeed) VALUES('SAGAR')
INSERT INTO #_tempRawFeed(RawFeed) VALUES('Nikhil')
INSERT INTO #_tempRawFeed(RawFeed) VALUES('Deepali')

DECLARE @RawFeed    VarChar(MAX)

SELECT @RawFeed = COALESCE(@RawFeed + ', ', '') + ISNULL(RawFeed, '') 
FROM #_tempRawFeed

SELECT @RawFeed

DROP TABLE #_tempRawFeed

更多关于将不同的行值连接成单个字符串的信息:Concatenate many rows into a single text string?

我很确定您也可以避免使用第一个光标。请避免使用游标,因为这确实会损害性能。使用基于集合的操作也可以获得相同的结果。

【讨论】:

我想一次处理每个 RawFeed 列。 期待什么结果? 希望在每次迭代时将每一行存储在变量中...并删除变量的先前值

以上是关于使用游标处理存储过程中表中的每一行的主要内容,如果未能解决你的问题,请参考以下文章

mysql 存储过程,游标总是多读一行,泪奔求助

MySQL游标的简单实践

Oracle 存储过程 - 游标内循环

存储过程 游标使用实例

oracle存储过程效率问题,处理1500w的数据插入

Oracle存储过程游标for循环怎么写