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 gamesmax2
      Boa noite,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome having status = 'Ok'
    • By gamesmax2
      Boa tarde,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome ORDER BY having status = 'Ok'  
       
    • By Thiago Btos
      Bom dia pessoal.
       
      Estou com uma dúvida na estruturação do select.
      Tenho um relatório que está extraindo já informações corretamente, com base no período gerado (inicial e final)
      Exemplo de como está hoje:
      SELECT D.CATEGORIA, SUM(D.VALOR) AS VALOR_VENDA, D.DATA AS (MES_ANO) FROM DUAL D WHERE D.DATA BETWEEN '20210501' AND '20210731' GROUP BY D.CATEGORIA, D.DATA Retornando:
      Categoria | Valor_venda     | Mes_Ano
      1                |     1000,00         | 05/2021
      1                |     2000,00         | 06/2021
      1                |       800,00         | 07/2021
      2                |      500,00          | 05/2021
      2                |      200,00          | 07/2021
      2                |      700,00          | 06/2021
       
      Até ai está tranquilo.
      Porém foi solicitado para adicionar uma coluna YTD (Year to data - acumulado do ano) agrupando o valor total da venda do ano do filtro.
      Então se foi colocado uma data do período Jan/2020 a Mar/2020, essa nova coluna tem que pegar as vendas do ano inteiro de 2020
       
      E precisa me retornar assim:
       
      Categoria | Valor_venda     | Mes_Ano  |  YTD
      1                |     1000,00         | 05/2021   |  15000,00
      1                |     2000,00         | 06/2021   |  15000,00
      1                |       800,00         | 07/2021   |  15000,00
      2                |      500,00          | 05/2021   |  8000,00
      2                |      200,00          | 07/2021   |  8000,00
      2                |      700,00          | 06/2021   |  8000,00
       
      (Os valores de 15000 e 8000 seria a soma do ano inteiro)
       
      O que consegui pensar seria um subselect que tem o where com data do ano, porém nesse caso retorno mais de um resultado no subselect, não dando para usar...
       
      Qual seria a alternativa que tenho?
       
×

Important Information

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