Oracle PL / SQL游标更新

时间:2014-03-16 19:22:34

标签: sql oracle plsql cursor

我正在使用oracle。我的SQL技能非常差,我想通过使用游标从我获得的查询中更新信息,我已经阅读了有关使用WHERE CURRENT OF语句的信息,但我不知道它如何适合我当前的代码。有谁介意伸出援助之手?我想允许一个调用程序更新当前代码中查询返回的游标中的一行(我想更新竞争位置)。到目前为止,这是我的代码:

DECLARE 
l_race_rec race%rowtype;

CURSOR Query1
IS
  SELECT * 
    FROM RACE 
   WHERE Race_Time='22-SEP-14 12.00.00.000000000'; 
BEGIN
OPEN Query1;
LOOP
FETCH query1 INTO l_race_rec;
EXIT WHEN query1%notfound;

dbms_output.put_line( l_race_rec.raceid || ', ' || l_race_rec.race_location || ', ' || 
l_race_rec.race_type || ', ' || l_race_rec.race_time || ', ' || l_race_rec.sex || ', ' || 
l_race_rec.minage || ', ' || l_race_rec.maxage );
END LOOP;
CLOSE Query1;    
END;

2 个答案:

答案 0 :(得分:2)

这是一个让你前进的例子:

DECLARE 
  l_race_rec race%rowtype;

  CURSOR Query1 IS
    SELECT * 
      FROM RACE 
      WHERE Race_Time = '22-SEP-14 12.00.00.000000000'; 

  nSome_value  NUMBER := 42;
BEGIN
  OPEN Query1;

  LOOP
    FETCH query1 INTO l_race_rec;
    EXIT WHEN query1%notfound;

    dbms_output.put_line(l_race_rec.raceid || ', ' ||
                         l_race_rec.race_location || ', ' || 
                         l_race_rec.race_type || ', ' ||
                         l_race_rec.race_time || ', ' ||
                         l_race_rec.sex || ', ' || 
                         l_race_rec.minage || ', ' ||
                         l_race_rec.maxage );

    UPDATE RACE
      SET SOME_FIELD = nSome_value
      WHERE CURRENT OF QUERY1;
  END LOOP;

  CLOSE Query1;    
END;

分享并享受。

答案 1 :(得分:2)

为什么不使用游标进行循环。

...
for row in query1
loop
dbms_output.put_line(row.raceid || ', ' ||
                     row.race_location || ', ' || 
                     row.race_type || ', ' ||
                     row.race_time || ', ' ||
                     row.sex || ', ' || 
                     row.minage || ', ' ||
                     row.maxage );

UPDATE RACE
  SET SOME_FIELD = nSome_value
  WHERE CURRENT OF QUERY1;

end loop;
...

这样就不需要打开和关闭光标了。

请记住,游标for循环对于结果超过1行的游标效果更好。

祝你好运。