Jump to content
devenr

Validar campo para realizar update corretamente

Recommended Posts

E ai pessoal!

 

Estou desenvolvendo uma procedure e estou com dificuldade para validar um campo.

É seguinte, preciso verificar se o campo contem um registro, se contem, realiza o update concatenando com o registro de entrada e se não conter registro, apenas faça o update com o registro de entrada.

Obs: Esse campo é separado por virgula.

 

Segue o meu código:

CREATE OR REPLACE PROCEDURE SP_VINCULO (
    P_COD_MATRIZ IN TB_EDIEXT_PERFIL.COD_MATRIZ%TYPE,
    P_CONCIL IN TB_EDIEXT_PERFIL.CONCIL%TYPE,
    P_ID_MBX IN TB_EDIEXT_PERFIL_MBX.ID_MBX%TYPE,
    P_ID_CONCIL INT,
    P_DIR_DEST VARCHAR2,
    P_PROTOCOLO VARCHAR2
)
IS
    V_EC TB_EDIEXT_PERFIL.CONCIL%TYPE;
    V_REG_CONCIL NUMBER(1);
    V_CONCIL_EC VARCHAR(10);
    CONTEM_EC EXCEPTION;
    CONTEM_REG EXCEPTION;
    
    CURSOR VERIFICA_EC IS
    SELECT P_CONCIL
    FROM TB_EDIEXT_PERFIL
    WHERE CONCIL = 'EC';
        
    CURSOR VERIFICA_CONCIL IS
    SELECT CONCIL
    FROM TB_EDIEXT_PERFIL
    WHERE CONCIL = 'EC';
    
BEGIN

    INSERT INTO TB_EDIEXT_PERFIL_MBX 
        VALUES 
    (PERFIL_MBX.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ), 
    (SELECT ID FROM TB_EDIEXT_MBX WHERE MBX = 'MB'||P_CONCIL));
    
    IF P_PROTOCOLO = 'SFTP' THEN
        INSERT INTO TB_EDIEXT_PERFIL_SFTP
                VALUES 
        (PERFIL_SFTP.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),
                                                                                  P_ID_CONCIL, 
                                                                                  P_DIR_DEST);
        UPDATE TB_EDIEXT_PERFIL 
        SET SFTP = 1 
        WHERE COD_MATRIZ = P_COD_MATRIZ;
    
    ELSE
        INSERT INTO TB_EDIEXT_PERFIL_CD
                VALUES 
        (PERFIL_CD.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),
                                                                                P_ID_CONCIL, 
                                                                                P_DIR_DEST,
                                                                                NULL);
        UPDATE TB_EDIEXT_PERFIL 
        SET CD = 1 
        WHERE COD_MATRIZ = P_COD_MATRIZ;
    END IF;
    
    
    OPEN VERIFICA_EC;
        FETCH VERIFICA_EC INTO V_EC;
        
    IF P_CONCIL = 'EC' THEN
        RAISE CONTEM_EC;
    END IF;     
    

SELECT CASE WHEN EXISTS (
        SELECT CONCIL FROM TB_EDIEXT_PERFIL WHERE CONCIL LIKE P_CONCIL)
            THEN 1
            ELSE 0
    END AS VERIFICA_CONC INTO V_REG_CONCIL
    FROM DUAL;   

 
    IF V_REG_CONCIL = 1 THEN
        RAISE CONTEM_REG;
    END IF;

   OPEN VERIFICA_CONCIL;
    FETCH VERIFICA_CONCIL INTO V_CONCIL_EC;
    



-- NESTA ETAPA ESTOU VERIFICANDO SE O CAMPO É = 'EC', SE FOR ELE FAZ APENAS O UPDATE SUBSTITUINDO PARA O P_CONCIL DE ENTRADA

    IF V_CONCIL_EC = 'EC' THEN
        UPDATE TB_EDIEXT_PERFIL
        SET CONCIL = P_CONCIL
        WHERE COD_MATRIZ = P_COD_MATRIZ;



-- AQUI DEVERIA FAZER O UPDATE CONCATENANDO O P_CONCIL, MAS NÃO ESTÁ FUNCIONANDO.
    ELSE 
        UPDATE TB_EDIEXT_PERFIL
        SET CONCIL = (SELECT CONCIL FROM TB_EDIEXT_PERFIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ)||','||P_CONCIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ AND ROWNUM = 1;
    END IF;                 

    EXCEPTION
        WHEN CONTEM_EC
            THEN DBMS_OUTPUT.PUT_LINE('NÃO É PERMITIDO VINCULAR '||V_EC);
        WHEN CONTEM_REG
            THEN DBMS_OUTPUT.PUT_LINE('ERRO! A matriz ja possui vinculo com a conciliadora.'); 
    
CLOSE VERIFICA_EC;
CLOSE VERIFICA_CONCIL;
END;
/

 

O que está ocorrendo é o seguinte, ele está substituindo o campo CONCIL sempre com o parâmetro de entrada P_CONCIL e a concatenação não está funcionando.

 

Alguém sabe o porque? 

 

Obrigado desde já!

Share this post


Link to post
Share on other sites

Isto nem deveria compilar ...

 UPDATE TB_EDIEXT_PERFIL
        SET CONCIL = (SELECT CONCIL FROM TB_EDIEXT_PERFIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ)||','||P_CONCIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ AND ROWNUM = 1;
    END IF;  

Share this post


Link to post
Share on other sites
24 minutos atrás, Motta disse:

Isto nem deveria compilar ...


 UPDATE TB_EDIEXT_PERFIL
        SET CONCIL = (SELECT CONCIL FROM TB_EDIEXT_PERFIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ)||','||P_CONCIL 
        WHERE COD_MATRIZ = P_COD_MATRIZ AND ROWNUM = 1;
    END IF;  

 

Pois é... :(

Sabe como solucionar esse problema?

Share this post


Link to post
Share on other sites

TENTE

 UPDATE TB_EDIEXT_PERFIL
        SET CONCIL =   CONCIL||P_CONCIL /*SE NULO INCLUI , SENAO CONCATENA*/
        WHERE  ...

 

Share this post


Link to post
Share on other sites
Em 13/03/2020 at 16:35, Motta disse:

TENTE


 UPDATE TB_EDIEXT_PERFIL
        SET CONCIL =   CONCIL||P_CONCIL /*SE NULO INCLUI , SENAO CONCATENA*/
        WHERE  ...

 

 

No caso, eu terei que criar um cursor para inserir o valor da variável no CONCIL?
Não entendi esse:

/*SE NULO INCLUI , SENAO CONCATENA*/

É alguma especie de IF no where?

Share this post


Link to post
Share on other sites

Pelo que entendi bastaria uma atribuição direta , se o conteúdo anterior estiver nulo fica o novo senão concatena.

 

1)

 

CONCIL = null

P_CONCIL = '1'

 

CONCIL  = '1'

 

2)

 

CONCIL = '2'

P_CONCIL = '1'

 

CONCIL  = '21'

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Diego-SLP
      Bom dia,
       
      Teria como eu fazer um UPDATE na minha base colocando através de um FORM o VALOR_UNITARIO sendo que a QUANTIDADE já tenho na base de dados, e assim, atualizar o campo VALOR FINAL já? 
       
      Vou atualizar varios registros de uma vez.
    • By adrianno
      Boa noite, tenho a seguinte questão, tenho uma tabela com  campo  "valor"  que guarda um valor monetário e campo "data" com a data do lançamento e um campo "tipo" marcando se é entrada ou saida,  ao cadastrar um valor, coloco a data e qual tipo "entrada" ou "saida"    quero montar uma view que soma todos os valores por mês, separados por tipo, se é entrada ou saida.   A seguinte query me tras a soma, porém não agrupa pelo MES/ANO
      SELECT DATE_FORMAT(data, "%m/%Y") as MES, (select Sum(valor) from controle WHERE tipo = 'SAIDA' ) as VS, // soma tudo que for SAIDA (select Sum(valor) from controle WHERE tipo = 'ENTRADA' ) as VE // soma tudo que for ENTRADA FROM controle GROUP BY YEAR(data), MONTH(data) // agrupa por ANO/MES mas este grupo nao opera nas somas dos valores ORDER BY data DESC  Esta query  somas os valores  mas não filtra pelo mes/ano e tras a soma total de tudo ignorando o mes,  mostra o mesmo valor total de cada tipo em todos os meses:
      EXEMPLO DO RESULTADO
      MES                 VS(saida)     VE(entrada)
      06/2020         4600,00        9750,00
      05/2020         4600,00        9750,00
      04/2020         4600,00        9750,00
       
      Na prática cada mês deveria retornar as somas dos valores apenas dele. Como fazer com que  GROUP BY YEAR(data), MONTH(data)   tenha efeito correto em cada tipo?   
    • By junior3d
      Estudo há poucos dias PHP e gostaria de saber no trecho abaixo por que usa-se o bindValue para jogar o conteúdo da variável na sql do método prepare do PDO?
      segue o trecho:
      $sql = $pdo->prepare("INSERT INTO usuarios (nome, email, telefone, senha) VALUES (:n, :t, :e, :s)"); $sql->bindValue(":n",$nome); $sql->bindValue(":t",$telefone); $sql->bindValue(":e",$email); $sql->bindValue(":s",$senha); $sql->execute(); Por que não poderia assim?
      $sql = $pdo->prepare("INSERT INTO usuarios (nome, email, telefone, senha) VALUES ($nome, $telefone, $email $senha)"); $sql->execute();  
    • By sirrocha
      Pessoal, tenho duas tabelas. Uma se chama prestacoes e a outra despesas.
      Cada prestação criada gera um id_prestacao que é único para cada uma gerada. Dentro da tabela despesas, se eu registro, por exemplo, 4 despesas, ficarão:
       
      id_prestacao = 1, 1, 1, 1
      id_despesa = 1, 2, 3, 4
       
      -> Cada despesa tem um valor, ao qual está na tabela despesas com o nome precoDespesa.
       
      -> O que eu gostaria é de poder, na tabela prestacoes, somar o valor destas despesas e colocar na coluna "valor_total" para cada id_prestacao gerado.
       
      Qual seria a maneira mais adequada de fazer isto, e que eu poderia compreender a estrutura criada para fazer essa "filtragem"
       
      UPDATE prestacoes SET valor_total = (
          SELECT SUM(precoDespesa) FROM despesas
          ORDER BY id_prestacao
      )
       
      Na tabela despesas, tenho atualmente
      id_prestacao - id_despesa - Valor
      1 - 1 - 30
      1 - 2 - 40
      1 - 3 - 30
       
      Com essa tentativa, vamos supor que tenho a tabela prestações:
      id_prestacao - projeto - ValorTotal
      1 - Projeto A - 100 
      2 - Projeto B - 100
      3 - Projeto C - 100
       
      Ou seja, o valor total do somatório para o id_prestação está vindo como 100 (até ai tudo bem), porém não está filtrando na tabela prestações onde deve ser colocado. O 100, nesse caso, deveria ficar apenas na primeira linha, sendo os valores totais de B e C igual a 0.
    • By Rafael Castelhano
      Olá, tenho 4 tabelas com a seguinte estrutura:
      OCORRENCIAS
      Data Pasta TERCEIROS
      Pasta Acordo CUSTOS
      Pasta Valor COBRANCAS
      Pasta Valor Todas as tabelas relacioanadas pelo campo Pasta. Preciso montar uma consulta que mostre na mesma linha, para cada pasta a soma dos acordos (tabela TERCEIROS), a soma dos valores da tabela CUSTOS, e a soma dos valores da tabela COBRANCAS, o resultado seria algo como:
      --
      Data                   Pasta          Acordos              Custos       Cobrancas
      17/05/2020       55                 850                       320                 50
      --
      Meu select está desta forma
      SELECT OCORRENCIAS.Data, OCORRENCIAS.Pasta, SUM(TERCEIROS.Acordo) AS Acordos, SUM(CUSTOS.Valor) AS Custos, SUM(COBRANCAS.Valor) AS Cobrancas FROM ((OCORRENCIAS INNER JOIN TERCEIROS ON OCORRENCIAS.Pasta = TERCEIROS.Pasta) LEFT JOIN CUSTOS ON OCORRENCIAS.Pasta = CUSTOS.Pasta) LEFT JOIN COBRANCAS ON OCORRENCIAS.Pasta = COBRANCAS.Pasta GROUP BY OCORRENCIAS.Data, OCORRENCIAS.Pasta; O Problema é que ele multiplica o valor dos acordos pra cada ocorrência na tabela cobranças (por exemplo).
       
      Alguma dica pra resolver o problema?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.