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
  

Mensagemem Qui, 12 Mar 2020 11:03 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:

Código: Selecionar todos
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á!
dvzrna

Mensagemem Qui, 12 Mar 2020 12:55 pm

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

Código: Selecionar todos
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:
Código: Selecionar todos
    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.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes