PL/SQL 使用 FETCH 的游标 FOR 循环

PL/SQL Cursor FOR loop using FETCH

我正试图帮助我的朋友完成他的 Oracle 作业,他遇到了以下问题:

如果博客 ID 小于 4,则使用游标 FOR 循环检索博客 ID、博客 url 和博客描述,并将其放入游标变量中。获取并处理每条记录,并在 table 日志中为返回的每个博客 ID 插入一行。

我们发现它很难理解,但我们有疑问:

DECLARE
    CURSOR blog_cursor IS SELECT * FROM blog;
BEGIN
  FOR blog_item IN blog_cursor LOOP
    IF( blog_item.blog_id > 4 ) THEN
      -- Insert a row in the "table log"
      INSERT INTO log( log_id, log_url, log_desc )
      VALUES( blog_item.blog_id, blog_item.blog_url, blog_item.blog_desc );
    END IF;
  END LOOP;
END;
/

Table:

blog
    blog_id
    blog_url
    blog_desc

查询完成了这项工作,但它没有使用 FETCH 关键字,因此我们认为它在技术上不正确。这个问题似乎写得不好,但您将如何使用 FETCH 关键字回答它?我是 PL/SQL 的新手,但我有 SQL.

的经验

你做对了,你不需要提取,事实上你做了提取,但是你隐式地做了,要使用 fetch 关键字,你需要一个 record 类型,并且您将需要打开和关闭游标并检查它是否打开并检查它是否有行(在循环中),以下是您的游标的另一个使用 fetch 和记录类型的 for:

DECLARE
    CURSOR blog_cursor IS SELECT * FROM blog;
    blog_item blog%rowtype;
BEGIN
  OPEN blog_cursor;
  LOOP
    FETCH blog_cursor INTO blog_item;
    EXIT WHEN blog_cursor%NOTFOUND;
    IF( blog_item.blog_id > 4 ) THEN
      -- Insert a row in the "table log"
      INSERT INTO log( log_id, log_url, log_desc )
      VALUES( blog_item.blog_id, blog_item.blog_url, blog_item.blog_desc );
    END IF;
  END LOOP;
  CLOSE blog_cursor;
END;