Oracle Cursor没有从SELECT语句填充?

时间:2013-03-14 10:41:37

标签: sql oracle stored-procedures

我一直在编写一个Stored Proc来从表中选择一堆ID,将结果集保存到游标中,然后循环遍历Cursor,根据表中焦点的任何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;

我在这里编写的内容很好,但是在执行时,更新永远不会发生。我已经在输出行中添加了以查看Cursor中的偶数,但没有任何内容被打印出来。

我的Select语句填充Cursor本身运行正常,返回我期望它的所有数据,虽然在上面执行时没有。就好像在Begin之后的所有内容都没有执行,虽然我无法理解为什么如前所述,我的Select会自行返回结果。

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

我们无法声明游标的rowtype 如果我们在for loop中使用游标,for 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;