0

我一直在编写一个存储过程来从表中选择一堆 ID,将结果集保存到游标中,然后遍历游标,根据游标中关注的任何 ID 更新表中的行。计划添加更多的条件语句,但到目前为止..

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS

CURSOR
person_cur
IS

select b.id
    from blah1 b
        inner join blah2 b2 on b.id = b2.fkid;
person_rec person_cur%ROWTYPE;

BEGIN
FOR person_rec in person_cur

LOOP

dbms_output.put_line
(
person_rec.id
);

UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;

END LOOP;
COMMIT;

END;

我在这里编译得很好,但在执行时,更新永远不会发生。我已在输出行中添加以查看光标中的内容,但没有打印任何内容。

我的用于填充光标的 Select 语句本身运行良好,返回了我期望它返回的所有数据,尽管在上面执行时,什么也没有。好像 Begin 之后的所有内容都没有执行,尽管我不明白为什么如前所述,我的 Select 会自行返回结果。

也许在填充游标的情况下,某些行为会有所不同?任何建议都会很棒..

4

2 回答 2

1

请检查没有光标和循环的过程。

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS
BEGIN
UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id IN (select b.id
    from blah1 b inner join blah2 b2 on b.id = b2.fkid);
END;

使用循环检查

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS
CURSOR person_cur IS
  select b.id
    from blah1 b
        inner join blah2 b2 on b.id = b2.fkid;

  person_rec person_cur%ROWTYPE;
BEGIN
    OPEN person_cur;
    LOOP
      FETCH person_cur INTO person_rec;
      EXIT WHEN person_cur%NOTFOUND;

      UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;
    END LOOP;
    CLOSE person_cur;
END;
于 2013-03-14T10:52:00.700 回答
0

如果我们在变量中使用rowtype游标,我们不能声明一个游标,用于访问游标中的列。for loopfor loop

因此,删除rowtype声明并尝试类似,此外SET SERVEROUT ON在执行过程之前包含命令以查看结果(可打印的语句)

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS

CURSOR person_cur IS
     select b.id from blah1 b inner join blah2 b2 on b.id = b2.fkid;
BEGIN
     FOR person_rec in person_cur LOOP
          dbms_output.put_line(person_rec.id);
          UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;
     END LOOP;
     COMMIT;
END;
于 2013-03-14T10:49:35.010 回答