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 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?
    • Por Wandersonwfs
      Bom dia Pessoal,
       
      Estou com um problema para finalizar uma consulta onde, quando executado a consulta  e não encontrado nenhuma informação no período solicitado, tenho que trazer pelo menos o nome da conta.
       
      Consulta,
       
      WITH TMPESTONO (
          NOME_IMPOSTO
          ,MES
          ,VALOR
          )
      AS (
          SELECT 'ESTORNO SOBRE GREEN VILLE' AS NOME_IMPOSTO
              ,'F_' + SZN.ZN_ITEM AS FILFOR
              ,SUM((SZN.ZN_PRV * SZN.ZN_PRCAPL) / 100) AS TOTAL
          FROM SZN010 SZN
          WHERE SZN.D_E_L_E_T_ = ' '
              AND SZN.ZN_ITEM IN (
                  '01'
                  ,'16'
                  ,'30'
                  ,'40'
                  ,'46'
                  ,'51'
                  ,'52'
                  ,'60'
                  ,'70'
                  ,'72'
                  ,'73'
                  ,'80'
                  )
              AND SZN.ZN_DATA BETWEEN '20220701'
                  AND '20220731'
              AND SZN.ZN_DESC = ('GRENVILLE')
          GROUP BY SZN.ZN_DESC
              ,SZN.ZN_ITEM
          )
      SELECT *
      FROM (
          SELECT NOME_IMPOSTO
              ,MES
              ,VALOR
          FROM TMPESTONO
          ) AS PivotData
      PIVOT(SUM(VALOR) FOR MES IN (
                  [F_16]
                  ,[F_30]
                  ,[F_40]
                  ,[F_46]
                  ,[F_51]
                  ,[F_52]
                  ,[F_60]
                  ,[F_70]
                  ,[F_72]
                  ,[F_73]
                  ,[TOTAL]
                  )) AS PivotTable2
      ORDER BY 1
       
×

Informação importante

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