› Fóruns › SQL e PL/SQL › ORA-01403: no data found › ORA-01403: no data found
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.