是否可以从异常中继续循环?

Pro*_*eur 21 oracle plsql

我有一个在循环内执行的提取.如果这个获取失败(没有数据),我想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;
Run Code Online (Sandbox Code Playgroud)

ang*_*gus 15

CONTINUE声明是11g的新功能.

以下是一个相关问题:Oracle 10g PL/SQL中的'CONTINUE'关键字


DCo*_*kie 10

在您提供的构造中,您不需要CONTINUE.一旦处理了异常,就会执行END之后的语句,假设您的EXCEPTION块没有终止该过程.换句话说,它将继续到user_rec循环的下一次迭代.

您还需要在BEGIN块中选择SELECT INTO变量:

SELECT attr INTO v_attr FROM attribute_table...
Run Code Online (Sandbox Code Playgroud)

显然你必须声明v_attr ......


tbo*_*one 6

怎么样的ole goto声明(我知道,我知道,但它在这里工作得很好;)

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;
Run Code Online (Sandbox Code Playgroud)

当然,只需将end_loop放在循环的最后.null可以用提交替换,也可以用计数器增量替换,由你决定.