Validar se existe o registro na coluna para efetuar update

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
dvzrna
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Ter, 05 Nov 2019 10:10 am

Olá amigos,

Gostaria de saber se tem alguma maneira melhor de validar o campo CONCIL da tabela PERFIL verificando se for igual a 'EC', executar um update, se não executar outro update, conforme a minha query abaixo:

Selecionar tudo

SET serveroutput ON;
DECLARE
    P_COD_MATRIZ VARCHAR2(10);
    P_CONCIL VARCHAR2(50);
    V_EXISTS NUMBER(1);
BEGIN

SELECT 
    CASE WHEN NOT EXISTS (
        SELECT CONCIL INTO P_CONCIL FROM TB_EDIEXT_PERFIL WHERE CONCIL = 'EC') 
        THEN 0 
        ELSE 1
    END AS VERIFICA_CONCIL INTO V_EXISTS
FROM DUAL;
        
    IF V_EXISTS = 0 THEN
    UPDATE TB_EDIEXT_PERFIL SET CONCIL = P_CONCIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ;
    
    ELSE
    UPDATE TB_EDIEXT_PERFIL SET CONCIL = (
        SELECT CONCIL INTO P_CONCIL FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ)||','||P_CONCIL WHERE COD_MATRIZ = P_COD_MATRIZ;

    END IF;
    END;
    /
Se contem o registro 'EC' no campo CONCIL, é efetuado o UPDATE substituindo por outro registro e se não conter o 'EC', é efetuado o UPDATE concatenando com o registro já existente.

Obrigado desde já!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tem um monte de coisa estranha nesse seu programa. De erros de sintaxe a erros de lógica.

Selecionar tudo

SET serveroutput ON;
DECLARE
    P_COD_MATRIZ VARCHAR2(10);
    P_CONCIL VARCHAR2(50);
    V_EXISTS NUMBER(1);
BEGIN

  BEGIN
    --Testa se existe CONCIL=EC
    SELECT CONCIL 
    INTO P_CONCIL 
    FROM TB_EDIEXT_PERFIL 
    WHERE CONCIL = 'EC'
      AND ROWNUM = 1;
 
    --Se existe, faz update.
    UPDATE TB_EDIEXT_PERFIL 
    SET CONCIL = (SELECT CONCIL 
                  FROM TB_EDIEXT_PERFIL 
                  WHERE COD_MATRIZ = P_COD_MATRIZ
                    and rownum = 1) 
    WHERE COD_MATRIZ = P_COD_MATRIZ;
  
  EXCEPTION WHEN NO_DATA_FOUND
  THEN
    --Se não existe, faz este update.
    UPDATE TB_EDIEXT_PERFIL 
    SET CONCIL = P_CONCIL
    WHERE COD_MATRIZ = P_COD_MATRIZ;
END;
/
Eu dei uma re-estruturada geral acima.
Pra começar, não ta sendo setado os valores de P_COD_MATRIZ. E isso vai dar problema.

Depois o primeiro UPDATE ta setando um valor que já está lá.
Veja:

Selecionar tudo

    UPDATE TB_EDIEXT_PERFIL 
    SET CONCIL = (SELECT CONCIL 
                  FROM TB_EDIEXT_PERFIL 
                  WHERE COD_MATRIZ = P_COD_MATRIZ
                    and rownum = 1) 
    WHERE COD_MATRIZ = P_COD_MATRIZ;
  
Veja, ele está buscando o CONCIL da tabela TB_EDIEXT_PERFIL com COD_MATRIZ = PC_COD_MATRIZ.
Daí ele faz o update na tabela TB_EDIEXT_PERFIL setando esse valor no CONCIL do mesmo codigo!
Ou seja, ele está buscando um valor X e salvando o mesmo valor.
Responder
  • Informação