Ir para conteúdo
Alexandre Garcia

PL/SQL - Select retorna nenhum valor condição do IF é verdadeiro

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
/

 

 

image.png.2c8c74c361c3e9ceeb3c4a8093c53d25.png

figura 01

 

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.

 

 

image.png

Compartilhar este post


Link para o post
Compartilhar em outros sites
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;
/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por nohime
      Como resolver essas três tarefas sobre Comandos de Decisão IF do C#?
      2. Receber um número e verificar se ele esta na faixa de 0 à 9. Se sim, mostre uma mensagem afirmativa, caso contrário mostre uma mensagem indicando que o número não se encontra na faixa.
      6. Receber dois números e os apresente em ordem crescente. Utilize apenas a estrutura de decisão if, ou seja, sem o opcional else.
      9. Receber um ano e se este ano for bissexto exibir na tela “Ano Bissexto”, senão exibir na tela “Ano Não-Bissexto”. Um ano é bissexto se for divisível por 4, mas não por 100. Um ano também é bissexto se for divisível por 400.
    • Por mr22robot
      Estou com uma dúvida. É possível determinar um select a partir de uma escolha?
      Ex. 
      SELECT CASE WHEN a < b THEN select * from tabela1 WHEN d < e THEN select * form tabela2 END FROM tabela; Algo parecido. Se uma condição for atendida select1 , se outra condição for atendida: select2.
      O que acontece: estou com um relatorio que preciso criar no winthor e não consigo melhorar isso. Tenho de fazer três relatorios como solução. Se eu consigo implantar isso, eu faria somente um relatorio. 
      Tipo se marcar um campo, sai um relatorio. Se marcar outro, saí outro relatorio.
    • Por vagner.analista
      Senhores boa tarde, alguém pode me ajudar?
       
      Tenho a seguinte situação, um campo data em duas tabelas, onde caso o contrato tenha aditivo o campo data da tabela TITMCNTADITIVO,  fica preenchido. caso o contrato não tem aditivo ela fica com o valor null. Então caso o valor dessa tabela aditivo estiver null, eu gostaria de apresentar o campo data da tabela TITMCNT do contrato que tem a data fim do contrato, com o select abaixo eu consigo saber se tem aditivo ou não:
      SELECT TOP 1   (DATA + 90) AS DATAFIM              FROM TITMCNTADITIVO (NOLOCK)             WHERE 1=1             AND CODCOLIGADA = 1             AND IDCNT = 72 Neste caso este contrato não tem aditivo, então, gostaria que ele executasse outro SELECT:
      SELECT (DATAFIM + 90) AS DATA_FIM  FROM TITMCNT             WHERE IDCNT = '72'  
       
      O mais lógico que tentei foi assim, mas não dá certo:

      SELE
      CT TOP 1  (DATA + 90) AS DATAFIM, CASE (DATA) WHEN IS NULL THEN ( SELECT (DATAFIM + 90) AS DATA_FIM  FROM TITMCNT                     WHERE IDCNT = '72' ) END AS DATAFIM FROM TITMCNTADITIVO (NOLOCK) WHERE 1=1 AND CODCOLIGADA = 1 AND IDCNT = 72  
    • Por nicolasbessa
      Boa tarde!
       
      Como aplicar a regra abaixo em um select?

      Regra Join
      Quando o campo substr(x, 1,1)  ='1'
      montar a chave de pesquisa:
      y = '8' AND y1 =  'L'||lpad( x1, 2)) 

      Quando o campo substrt(x, 1,1) for igual ='A'
      montar a chave de pesquisa:
      y = '8' AND y1 =  'M'||lpad( x1, 2)) 
       
      obrigado!
    • Por caio_fgf
      Estou desenvolvendo um site e necessito que o menu receba a classe ativo quando o botão for clicado, e se este for clicado de novo ou qualquer parte do documento for clicada, o menu perca a classe.
      Ao clicar em outra parte da página, o menu desaparece, porém, ao clicar novamente no botão do menu, não consigo a aplicação desejada
      $(document).ready(function () { var menu = $("nav") $(".bt_menu").click(function (e) { if (menu.hasClass("ativo")) menu.removeClass("ativo"); else menu.addClass("ativo"); e.stopPropagation(); }); $(document).click(function (e) { $('nav').removeClass("ativo"); }); }); Grato pela atenção
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.