create or replace procedure llx_21
  v_bir date;
  v_id employg.id%TYPE;
  CURSOR c_emp 
    IS SELECT s_fun8(idcard),id  
         FROM employg;
BEGIN 
  OPEN c_emp;
  FETCH c_emp INTO v_bir,v_id;
  WHILE c_emp %FOUND LOOP
    UPDATE employg 
       SET birthday = v_bir
     WHERE id = v_id;
  END LOOP; 
  CLOSE c_emp;
   COMMIT;
END;create function s_fun8(card varchar2) return 
  date is idate date;
begin 
  select to_Date(substr(card,7,8),'yyyy-mm-dd') into idate from dual;
  return idate;
end;

解决方案 »

  1.   

    while死循环.
    SQL> set serveroutput on
    SQL> 
    SQL> create or replace procedure prc as
      2    cursor emp is
      3      select level from dual connect by level <= 3;
      4    v_id number;
      5  begin
      6    open emp;
      7    loop
      8      fetch emp
      9        into v_id;
     10      exit when emp%notfound;
     11      dbms_output.put_line(v_id);
     12    end loop;
     13  end;
     14  /
     
    Procedure created
     
    SQL> exec prc;
     
    1
    2
    3
     
    PL/SQL procedure successfully completed
     
    SQL> 
      

  2.   

    你上面只fetch了一次,然后成功,则%found一直为真,while变身长生不老
      

  3.   

    ----死循环造成的。
    SQL> create or replace procedure prc as
      2 cursor emp is
      3 select level from dual connect by level <= 3;
      4 v_id number;
      5 begin
      6 open emp;
      7 loop
      8 fetch emp
      9 into v_id;
     10 exit when emp%notfound;
     11 dbms_output.put_line(v_id);
     12 end loop;
     13 end;
     14 /
      

  4.   

    是加一句exit when c_emp%notfound  就行了吗?
    菜鸟。。 不太懂啊