2012-11-15 2 views
1
DECLARE 
past_due exception; 
CURSOR emp_cur IS 
select distinct e.empno as enum,e.ename,e.hiredate,e.sal,e.job1,e.comm,e.deptno,e.mgr 

from emp e join emp m 
on m.mgr=e.empno; 
c1 emp_cur%ROWTYPE; 
BEGIN 
OPEN emp_cur; 
LOOP 
    FETCH emp_cur INTO c1; 
    if emp_cur%NOTFOUND then 
raise past_due; 

/* INSERT INTO newempl(emp_id,emp_nm,emp_sal)*/ 
    insert into newemp(dno,dname,ddate,dbasic,djob,dcomm,dept) 
    values(c1.enum,c1.ename,c1.hiredate,c1.sal,c1.job1,c1.comm,c1.deptno); 
    dbms_output.put_line(c1.enum||' '||c1.ename); 
END LOOP; 
exception 
when past_due then 
raise_application_error(-2100,'fetching the records is completed'); 

END; 

내 오류가예외는

오류 보고서입니다가 발생 상징 "LOOP"다음 중 하나를 예상 :

을 경우 ORA-06550 : 25 행, 열 4 : PLS-00103 :가 발생했습니다 기호 "파일 끝"다음 중 하나를 기대하는 경우 :

끝이,369 정적 오버라이드 (override) 최종 인스턴스화 순서를 PRAGMA하지를멤버 생성자 맵 06550. 00000 - "행 % s, 열 % s : \ n % s" * 원인 : 일반적으로 PL/SQL 컴파일 오류입니다. * 작업 : 오류의 범위를 좁히려 고 시도하지 않았습니다.

답변

1

예외적으로 발생 후 end if;가 누락되었습니다.

DECLARE 
    past_due EXCEPTION; 

    CURSOR emp_cur 
    IS 
     SELECT DISTINCT e.empno AS enum, 
         e.ename, 
         e.hiredate, 
         e.sal, 
         e.job1, 
         e.comm, 
         e.deptno, 
         e.mgr 
     FROM emp e JOIN emp m ON m.mgr = e.empno; 

    c1   emp_cur%ROWTYPE; 
BEGIN 
    OPEN emp_cur; 

    LOOP 
     FETCH emp_cur INTO c1; 

     IF emp_cur%NOTFOUND 
     THEN 
     RAISE past_due; 
     END IF; 

     /* INSERT INTO newempl(emp_id,emp_nm,emp_sal)*/ 
     INSERT INTO newemp (dno, 
          dname, 
          ddate, 
          dbasic, 
          djob, 
          dcomm, 
          dept) 
      VALUES (c1.enum, 
        c1.ename, 
        c1.hiredate, 
        c1.sal, 
        c1.job1, 
        c1.comm, 
        c1.deptno); 

     DBMS_OUTPUT.put_line (c1.enum || ' ' || c1.ename); 
    END LOOP; 
EXCEPTION 
    WHEN past_due 
    THEN 
     raise_application_error (-2100, 'fetching the records is completed'); 
END;