Pular para o conteúdo

Fóruns SQL e PL/SQL ORA-01403: no data found ORA-01403: no data found

#90485
burga
Participante

    O cursor já trata a exceção de no data found, assim não fica estourando no select, quando não existe retorno pra ele, é mais fácil você buscar explicações pela internet pois eu não vou saber explicar direito, hehehehe, (não por falta de vontade mas por limitação mesmo), mas o código fica mais ou menos assim:

    DECLARE
    code varchar2( 2 );
    temp varchar2( 12 );
    msisdn varchar2( 10 );
    codeBuddy varchar2( 2 );
    tempBuddy varchar2( 12 );
    msisdnBuddy varchar2( 10 );
    idCustomer number;
    idCustomerBuddy number;

    cursor c_id_customer(tmp IN VARCHAR2) IS
         select id_customer into idCustomer from customer where msisdn = tmp;
    

    BEGIN

    FOR r IN (select
                ru.msisdn,
                bru.msisdn as BUDDY_MSISDN,
                bl.position
            from
                blah.buddy_lists bl
                inner join blah.nicknames n on ( bl.nick_id = n.nick_id )
                inner join blah.nicknames bn on ( bl.buddy_nick_id = bn.nick_id )
                inner join blah.registered_users ru on ( n.nick_id = ru.active_nick_id )
                inner join blah.registered_users bru on ( bn.nick_id = bru.active_nick_id )
            where
                ru.country = 'BR'
                and bl.nick_id  bl.buddy_nick_id
    ) LOOP
    
      code := SUBSTR( R.MSISDN, 1, 2 );
      msisdn := SUBSTR( R.MSISDN, 4 );
      temp := ( code || msisdn );
      open c_id_customer(temp);
      fetch c_id_customer into idCustomer;
      close c_id_customer;
    
      codeBuddy := SUBSTR( R.BUDDY_MSISDN, 1, 2 );
      msisdnBuddy := SUBSTR( R.BUDDY_MSISDN, 4 );
      tempBuddy := ( codeBuddy || msisdnBuddy );
    
      open c_id_customer(tempBuddy);
      fetch c_id_customer into idCustomerBuddy;
      close c_id_customer;
    
      insert into customer_buddylist ( id_customer_owner,  id_customer_buddy, list_order ) values ( idCustomer, idCustomerBuddy, r.position );
    
    END LOOP;
    

    /* EXCEPTION
    WHEN OTHERS THEN
    --raise_application_error( -20008, ( idCustomer || ' ' || idCustomerBuddy ) );
    raise_application_error( -20008, ( tempBuddy ) );*/
    END;

    Note que eu declarei um cursor com o select logo abaixo das declarações das variáveis locais. Depois foi feita a chamada a esse cursor no lugar dos dois selects que estavam sendo feitos dentro do LOOP. Assim ele usa variáveis bind também melhorando um pouco o desempenho do teu procedimento.