programing

예외에서 루프를 계속할 수 있습니까?

lastcode 2023. 7. 16. 13:35
반응형

예외에서 루프를 계속할 수 있습니까?

루프 내에서 가져오기가 실행되고 있습니다.이 가져오기가 실패하면(데이터 없음) 하고 싶습니다.CONTINUE내부에서 다음 레코드로 루프합니다.EXCEPTION.

이것이 가능합니까?

나는 받는 중입니다.ORA-06550&PLS-00201 identifer CONTINUE must be declared

DECLARE
   v_attr char(88);
CURSOR  SELECT_USERS IS
SELECT id FROM USER_TABLE
WHERE USERTYPE = 'X';
BEGIN
    FOR user_rec IN SELECT_USERS LOOP    
        BEGIN
            SELECT attr INTO v_attr 
            FROM ATTRIBUTE_TABLE
            WHERE user_id = user_rec.id;            
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               -- user does not have attribute, continue loop to next record.
               CONTINUE;
         END;         
    END LOOP;
END;

CONTINUE문은 11g의 새로운 기능입니다.

다음은 관련 질문입니다. Oracle 10g PL/SQL의 'CONTINUE' 키워드입니다.

제공한 구성에서 계속은 필요하지 않습니다.예외가 처리되면 EXECUMENT 블록이 절차를 종료하지 않는다고 가정하여 종료 후 문이 수행됩니다.즉, user_rec 루프의 다음 반복으로 계속됩니다.

또한 BEGIN 블록 내부의 변수를 선택해야 합니다.

SELECT attr INTO v_attr FROM attribute_table...

v_attr도 선언해야 합니다...

올레고투 스테이트먼트는 어떻습니까? (알아요, 알아요, 하지만 여기서는 잘 작동해요;

DECLARE
   v_attr char(88);
CURSOR  SELECT_USERS IS
SELECT id FROM USER_TABLE
WHERE USERTYPE = 'X';
BEGIN
    FOR user_rec IN SELECT_USERS LOOP    
        BEGIN
            SELECT attr INTO v_attr 
            FROM ATTRIBUTE_TABLE
            WHERE user_id = user_rec.id;            
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               -- user does not have attribute, continue loop to next record.
               goto end_loop;
         END;

        <<end_loop>>
        null;         
    END LOOP;
END;

물론 end_loop은 루프의 맨 끝에 놓으십시오.null은 커밋 또는 카운터 증분으로 대체할 수 있습니다.

이 예에서는 외부 조인을 사용해야 합니다.

declare
begin
  FOR attr_rec IN ( 
    select attr 
    from USER_TABLE u 
    left outer join attribute_table a 
    on ( u.USERTYPE = 'X' and a.user_id = u.id ) 
  ) LOOP
    <process records> 
    <if primary key of attribute_table is null 
     then the attribute does not exist for this user.>
  END LOOP;
END;

사용할 수 있는 공지사항WHEN exception THEN NULL당신이 사용하는 것과 같은 방법WHEN exception THEN continue예:

    DECLARE
        extension_already_exists  EXCEPTION;
        PRAGMA EXCEPTION_INIT(extension_already_exists, -20007);
        l_hidden_col_name  varchar2(32);
    BEGIN
        FOR t IN (  SELECT table_name, cast(extension as varchar2(200)) ext
                    FROM all_stat_extensions
                    WHERE owner='{{ prev_schema }}'
                      and droppable='YES'
                    ORDER BY 1
                 )
        LOOP
            BEGIN
                l_hidden_col_name := dbms_stats.create_extended_stats('{{ schema }}', t.table_name, t.ext);
            EXCEPTION
                WHEN extension_already_exists THEN NULL;   -- ignore exception and go to next loop iteration
            END;
        END LOOP;
    END;

언급URL : https://stackoverflow.com/questions/5903027/is-it-possible-to-continue-a-loop-from-an-exception

반응형