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

时间:2015-04-21 00:04:39

标签: sql oracle plsql

我正在尝试用他的Oracle作业来帮助我的朋友,他有以下问题:

如果blog id小于4,则使用游标FOR循环检索博客ID,博客URL和博客描述,并将其放在游标变量中。获取并处理每条记录,并在表日志中为返回的每个博客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;
/

表:

blog
    blog_id
    blog_url
    blog_desc

查询完成了这项工作,但它没有使用FETCH关键字,所以我们认为它在技术上并不正确。这个问题看起来很难写,但你会如何使用FETCH关键字回答它?我是PL / SQL的新手,但我有使用SQL的经验。

1 个答案:

答案 0 :(得分:1)

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

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;