【问题标题】:Oracle PL/SQL cursor updateOracle PL/SQL 游标更新
【发布时间】:2014-03-16 19:22:34
【问题描述】:

我正在使用甲骨文。我的 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;

【问题讨论】:

  • 如果有人想知道的话,仍然坚持这个:(
  • 甲骨文 3?真的吗?那是在 1983 年发布的!
  • 3.2.20.09是SQL Developer的版本,是客户端工具

标签: sql oracle plsql cursor


【解决方案1】:

这里有一个例子可以帮助你:

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;

分享和享受。

【讨论】:

    【解决方案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;
    ...
    

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

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

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2021-08-20
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2022-11-28
      • 2023-04-06
      相关资源
      最近更新 更多