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 Thiago Btos
      Boa tarde galera.
       
      Fiz um select que tras 4 informações do banco (matricula, nome, data e hora)
      SELECT QD1_MAT, RA_NOME, QD1_DTBAIX AS DATA, QD1_HRBAIX FROM QD1010 QD1 INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*' ORDER BY QD1_DTBAIX, QD1_HRBAIX Retornando os seguintes registros:

       
       
       
      Preciso retornar somente as linhas em amarelo, que seria a seguinte condição.
      Caso tiver alguma matricula igual, trazer somente o registro com a maior data, junto com seu respectivo horário.
       
       
      O mais próximo que consegui chegar foi utilizando o MAX para data e hora, e agrupando o restante dos campos.
      SELECT QD1_MAT,RA_NOME,MAX(DATA), MAX(QD1_HRBAIX) FROM ( SELECT QD1_MAT, RA_NOME, QD1_DTBAIX AS DATA, QD1_HRBAIX FROM QD1010 QD1 INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*' ) GROUP BY QD1_MAT,RA_NOME Porém na hora ele não pega o valor correspondente e sim o valor máximo.

       
       
      Ai estou travado nessa parte, como faço para trazer a hora corresponde sem o restante dos registros?
    • By mr22robot
      Boa tarde. Estou com o seguinte problema: Preciso retornar um selct da seguinte maneira:
      exemplo que não funciona:
      select codusur,numnota,codcli,cliente,vltotal,numtransvenda,dev,decode(vlvenda),if(vlvenda > 100 then 1 else 2) from( select tb1.codusur,tb1.numnota,tb1.codcli,tb1.cliente,tb1.vltotal,tb1.numtransvenda,DECODE(tb2.VLTOTAL,NULL,0,tb2.VLTOTAL)DEV from( select codusur,numnota,pcnfsaid.codcli,pcnfsaid.cliente,pcnfsaid.vltotal,pcnfsaid.numtransvenda from pcnfsaid where pcnfsaid.dtsaida > '01-OCT-2020' and pcnfsaid.dtcancel is null )tb1 left outer join (select DISTINCT VLTOTAL,VW_INTEGRA_DEVOLUCAO_TOTAL.NUMTRANSVENDA from VW_INTEGRA_DEVOLUCAO_TOTAL )tb2 on tb1.NUMTRANSVENDA = tb2.NUMTRANSVENDA order by numnota ) Como pode reparar, eu usei um if/else já que não sei a forma correta de usar. Pois com DECODE não consegui usar uma forma de fazer a comparação. 
      Pois preciso mesmo retornar uns valores fixos. Ex: 
      Se o valor > 40000, retorna um valor x; Se for maior que 5000 retorna um valor y. 
      Aguardo a ajuda dos amigos. Grato
    • By david2007
      Endpointer Framework é um Framework PHP para construção de APIs REST com Programação Procedural.
       
      http://endpointer.com
       
      Endpointer Framework é Código Aberto sob a licença MIT
       

    • By MarcosAntonio
      boa tarde. 
      Estou precisando de um Select que retorne uma soma que ao chegar a determinado valor ela reinicie e continue fazendo sucessivamente
       select   pedido,   volume,   limite,   SUM(volume) over (order by pedido ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) saldo   from pedidos  group by pedido o select está retornando assim porém quero que toda vez que chegue ou passe do limite resete o saldo, por exemplo parar no 100 que é o limite e começar um novo saldo
      pedido     volume    limite    saldo  1             70            100        70  2             10            100        80  3             20            100        100  4             50            100        150  5             30            100        180  
      preciso que ele soma o volume enquanto o saldo seja <= que o "limite", quando passar pare de somar e comece outra soma começando do 0, como no exemplo abaixo.
      pedido    volume    limite    saldo  1             70            100        70  2             10            100        80  3             20            100        100  4             50            100        50  5             30            100        80  
×

Important Information

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