terminar sintaxis romper personalizadas personalizada loop for excepciones dentro bucles oracle plsql

oracle - sintaxis - ¿Es posible CONTINUAR un bucle de una excepción?



sintaxis for loop oracle (5)

¿Qué hay de la declaración de Ole Goto? (Lo sé, lo sé, pero funciona bien aquí)

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;

Simplemente ponga end_loop al final del ciclo, por supuesto. El nulo se puede sustituir con un compromiso quizás o un incremento de contador, según usted.

Tengo un fetch ejecutado dentro de un bucle. Si esta recuperación falla (no hay datos) me gustaría CONTINUE el bucle al siguiente registro desde la EXCEPTION .

es posible?

Estoy obteniendo un PLS-00201 identifer CONTINUE must be declared ORA-06550 y 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;


En la construcción que ha proporcionado, no necesita un CONTINUAR. Una vez que se maneja la excepción, la declaración después de la finalización se lleva a cabo, asumiendo que su bloque de EXCEPCIÓN no termina el procedimiento. En otras palabras, continuará en la próxima iteración del bucle user_rec.

También necesita SELECCIONAR EN una variable dentro de su bloque BEGIN:

SELECT attr INTO v_attr FROM attribute_table...

Obviamente debes declarar v_attr también ...



Para este ejemplo, realmente deberías usar una combinación externa.

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;


Tenga en cuenta que puede usar la WHEN exception THEN NULL la misma manera que usaría la WHEN exception THEN continue la misma manera que la WHEN exception THEN continue . Ejemplo:

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;