Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Preciso fazer um IF onde a condição verdade seria o não retorno de uma SQL. Isso é possível?
Ex: Faço o busca para descobrir se um clube foi campeão entre 1900 e 1950 se não existir escreva não existe. Senão escreva existe.
Já ate consegui fazer algo Motta. O problema agora está no tratamento do erro NO_DATA_FOUND. Quando o SELECT não retorna nada ele não vai para o else e tudo para e saída é como na figura 01. Quando o SELECT retorna tudo funciona OK(figura 02). Teoricamente quando o SELECT rodar e nao tiver nenhum ator participando de filmes no seculo XX retorno deve ser null eu creio.
*CREATE OR REPLACE PROCEDURE excluir_NOT_SEC_XX (cod_prof NUMBER)
IS*
* xx NUMBER;
slq VARCHAR2(1000);
ERRO_2292 EXCEPTION;
PRAGMA
EXCEPTION_INIT (ERRO_2292, -2292);
BEGIN*
* slq := 'SELECT
count(filme.ano)
FROM
LOCACAO LEFT JOIN ((PARTICIPACAO RIGHT JOIN filme ON PARTICIPACAO.COD_FILME = filme.COD_FILME)
LEFT JOIN PROFISSIONAL_CINEMA ON PARTICIPACAO.COD_PROFISSIONAL_CINEMA = PROFISSIONAL_CINEMA.COD_PROFISSIONAL_CINEMA) ON LOCACAO.COD_FILME = filme.COD_FILME
WHERE FILME.ANO >1900 AND FILME.ANO < 2001 AND PARTICIPACAO.COD_PROFISSIONAL_CINEMA = '|| cod_prof || '
GROUP BY FILME.ANO';
EXECUTE IMMEDIATE slq INTO xx;*
* *
* IF xx > 0 then
Dbms_output.put_line('Ator eh eh do seculo XX');
ELSE
Dbms_output.put_line('Ator nao do seculo XX');
DELETE FROM profissional_cinema WHERE profissional_cinema.cod_profissional_cinema = cod_prof;
END IF;
*
* EXCEPTION
WHEN ERRO_2292
THEN Dbms_output.put_line('E NAO PODE SER EXCLUIDO POIS TEM PARTICIPACAO EM ALGUM FILME');
WHEN NO_DATA_FOUND THEN *
*dbms_output.put_line('XXX');
END;
/*
/monthly_2018_05/image.png.2c8c74c361c3e9ceeb3c4a8093c53d25.png" />
figura 01
/monthly_2018_05/image.png.8eac3e22c91a2e867c0fb831e881df43.png" />
figura 02
Nota:
Tenho uma constraint não permite excluir atores que participaram de filme.
Esse é objetivo:
Suponha a seguinte regra de negócio: nenhum profissional de cinema deve ser excluído, caso tenha participado em algum filme produzido no século passado.

>
4 horas atrás, Motta disse:
Publique o que fez.
Consegui Motta mas estou achando q o codigo está muito longo.
CREATE OR REPLACE PROCEDURE excluir_XX (cod_prof NUMBER)
IS
cursor c_busca IS
SELECT FILME.ANO
FROM (PARTICIPACAO LEFT JOIN PROFISSIONAL_CINEMA ON PARTICIPACAO.COD_PROFISSIONAL_CINEMA = PROFISSIONAL_CINEMA.COD_PROFISSIONAL_CINEMA)
RIGHT JOIN filme ON PARTICIPACAO.COD_FILME = filme.COD_FILME
WHERE PROFISSIONAL_CINEMA.COD_PROFISSIONAL_CINEMA = cod_prof
GROUP BY PROFISSIONAL_CINEMA.COD_PROFISSIONAL_CINEMA,filme.ano
ORDER BY PROFISSIONAL_CINEMA.COD_PROFISSIONAL_CINEMA;
v_filme_ano filme.ano%type;
flag NUMBER(4);
ERRO_2292 EXCEPTION;
PRAGMA
EXCEPTION_INIT (ERRO_2292, -2292);
BEGIN
OPEN c_busca;
LOOP
FETCH c_busca INTO v_filme_ano;
EXIT WHEN c_busca%NOTFOUND;
Dbms_output.put_line(v_filme_ano);
IF v_filme_ano > 1900 AND v_filme_ano < 2001 THEN
FLAG := v_filme_ano;
END IF;
END LOOP;
Dbms_output.put_line(flag);
CLOSE c_busca;
IF flag > 1900 AND flag < 2001 THEN
Dbms_output.put_line('Ator participou de filme no seculo XX');
Dbms_output.put_line('Nao excluir');
ELSE
Dbms_output.put_line('Ator nao participou de filme no seculo XX');
DELETE FROM profissional_cinema WHERE profissional_cinema.cod_profissional_cinema = cod_prof;
END IF;
EXCEPTION
WHEN ERRO_2292
THEN Dbms_output.put_line('E NAO PODE SER EXCLUIDO POIS TEM PARTICIPACAO EM ALGUM FILME');
END;
/
Publique o que fez.