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 ...
La instrucción CONTINUE
es una característica nueva en 11g.
Aquí hay una pregunta relacionada: la palabra clave ''CONTINUAR'' en Oracle 10g PL / SQL
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;