Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

  • Conteúdo Similar

    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por Rodrigo Bigas
      Olá colegas, 
      Desenvolvi um sistema simples de boletim escolar. Conforme os dados são inseridos nas textfields ao clicar no botão Resultado, deverá mostrar em uma JTable. O problema é que a última coluna (resultado) da JTable tem que estar dentro de uma condição if/else para setar se o aluno está "aprovado", "em recuperação" ou "reprovado conforme a condição". Estou com dificuldades em descobrir qual é o método correto que seta este resultado de forma dinâmica. Segue os prints:
       
      Conforme o código e o print acima, o sistema funciona somente para a primeira linha, porque está setando de forma estática, obtendo os valores do índice e coluna, qual seria o método para setar o valor de forma dinâmica do índice e coluna?
    • Por stefanyprs
      //modelo.html <!DOCTYPE html> <html lang="pt-br"> <head>     <meta charset="UTF-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Hora do dia</title>     <link rel="stylesheet" href="estilo.css"> </head> <body onload="carregar()">     <header>         <h1> Hora do dia </h1>         </h1>     </header>     <section>         <div id="msg">             msg         </div>         <div id="foto">             <img class="imagem" src="fotomanha.jpg" alt="foto do dia">         </div>     </section>     <footer>         <p>&copy; Rodapé </p>     </footer>     <script src="script.js"></script> </body> </html>   //script.js function carregar () {     var msg = window.document.getElementById('msg')     var img  = window.document.getElementsByClassName('imagem')      var data = new Date()     var hora = data.getHours()          msg.innerHTML = 'Agora são ' + hora + ' horas'          if (hora >= 0 && hora < 12){         //Bom dia         img.src = 'fotomanha.jpg'         } else if (hora >= 12 && hora < 18){         //Boa tarde         img.src = 'fototarde.jpg'      } else {         //Boa noite         img.src = 'fotonoite.jpg'     } }   //estilo.css body{     background-color: aqua;     font: normal 15pt Arial; } header{     color:rgb(255, 255, 255);     text-align: center; } section{     background: white;     border-radius: 10px;     padding: 15px;     width: 500px;     margin:auto;     box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.329);      } footer{     color:white;     text-align: center;     font-style: italic;   } div{     text-align: center; } .imagem{     width: 500px;    /* largura da imagem */     height: 350px;   /*  altura da imagem  */     margin-top: 10px; /* margem do topo */ }
    • Por Kefatif
      Prezados, boa tarde.
       
      Preciso de uma ajuda, tenho um select onde o usuário vai poder selecionar dentre os valores "1" e "2", mas gostaria que quando ele selecionasse o valor 2 fosse enviado um alerta de confirmação, estou tentando fazer através do evento blur, mas não estou sabendo fazer a comparação. Seria possível chamar o evento apenas se o valor selecionado for 2?
       
      Segue meu código teste abaixo.
       
      <!DOCTYPE html> <html> <head> <title>Teste</title> <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.1.min.js"></script> <script type="text/javascript"> $(function(){ //inserir os códigos aqui $("#fase").blur(function(){ alert("O input perdeu o foco."); }); }); </script> </head> <body> <label style="width:15%">Fase<b style="color:red">*</b><br> <select name="fase" id="fase" class="form-control" required style="width:100%" > <option value="1">1</option> <option value="2">2</option> </select> </label> <label style="width:15%">teste<b style="color:red">*</b><br> <select name="teste" class="form-control" required style="width:100%" > <option value="">Selecione</option> <option value="SIM">SIM</option> <option value="NÃO">NÃO</option> </select> </label> </body> </html>  
      Agradeço desde já.
       
      Abs.
×

Informação importante

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