Ir para conteúdo
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á!

Compartilhar este post


Link para o post
Compartilhar em outros 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;  

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

TENTE

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

 

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mamotinho
      Olá, estou a um tempo tentando acrescentar um codigo na coluna do SQL na qual seria VARBINARY

      A Coluna atual contém o seguinte codigo binary:
      Código (01)
      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167  
      No codigo acima eu gostaria de acrescentar o seguinte codigo:
      Código (02)
      0xCC010120CD010121CE010122CF010123
      no caso eu quero criar uma procedure que ao executar a função ele adicione o codigo 02 no código 01. no caso o codigo ficaria desta forma:

      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167CC010120CD010121CE010122CF010123



      Ficarei imensamente grato se alguém conseguir me ajudar, o orientar. sou iniciante nessa areá ainda.
    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
    • Por Sapinn
      Olá a todos existe alguma maneira de trazer todos os dados de uma tabela menos o maior valor?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.