Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mlgrassi

Como fazer um PL/SQL limitando o número de commits executando um arquivo .sql contendo inserts?

Recommended Posts

Prezados,

 

Tenho uma situação onde preciso criar um pl/sql que limite o número de comits para o sql executado. O problema é que a entrada é um arquivo sql pronto contendo inserts. Como poderia fazer isso? Desculpem, sou iniciante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Editar o arquivo é o mais simples , por limitar você diz um COMMIT a cada x INSERTS , não ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, isso mesmo Motta.
 

O pl/sql irá executar em ambiente linux, logo, recebo o arquivo de inserts.sql e conto suas linhas para saber quantos inserts terá no total. Depois, preciso executar esse lote de inserts e ao final preciso que retorne o número de commits executados com sucesso e a parte disso, os que não executaram por algum erro. Assim, posso fazer um batimento comparando o total com aquilo que foi comitado com sucesso.

 

Alguma dica sobre como eu poderia fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O INSERT é executado ou não , se o BD acatar a síntaxe e as validações que existirem (constraints , trigers etc) o INSERT é feito ,

 

o COMMIT é o comando que faz com que as alterações que estão válidas para sua sessão fiquem válidas para todo o BD.

 

Estamos falando de coisas diferentes creio.

 

Publique um exemplo do arquivo se possível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde,

 

Dependendo de como você estiver executando os inserts, você pode setar o autocommit

 

create table teste(
Id_teste number(12));


set autocommit 10


insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
insert into teste (id_teste) values(1);
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por asacap1000
      Salve galera estou com uma consulta, e preciso buscar a diferença entre datas, e em alguns casos são vários dias.
      Preciso que nesta consulta ele me retorne em dias, horas limitando a 23h minutos e segundos..
      A consulta que fiz foi essa:
       
      abs(trunc((AK1.DATA_FINAL - AK1.DATA_INICIAL))) AS dias, abs(trunc(24 * (AK1.DATA_FINAL - AK1.DATA_INICIAL))) AS horas, abs(trunc((MOD(MOD(AK1.DATA_FINAL - AK1.DATA_INICIAL, 1) * 24, 1) * 60))) AS minutos, abs(trunc((MOD((MOD(MOD(AK1.DATA_FINAL - AK1.DATA_INICIAL, 1) * 24, 1) * 60), 1) * 60))) AS segundos, ou essa aqui
       
      LPAD(TRUNC(( (AK1.DATA_FINAL - AK1.DATA_INICIAL) * 86400 / 3600)), 3, '0') ||':' || LPAD(TRUNC(MOD( (AK1.DATA_FINAL - AK1.DATA_INICIAL) * 86400 , 3600 ) / 60 ), 2, '0') || ':'|| LPAD(TRUNC(MOD(MOD( (AK1.DATA_FINAL - AK1.DATA_INICIAL) * 86400, 3600 ), 60)), 2, '0') calculado,  e nessa duas consultas ele me traz o total de horas o que complica.
      DIAS  HORAS  MINUTOS  SEGUNDOS  CALCULADO 0 6 1 10 006:01:11 0 0 31 28 000:31:28 0 1 5 8 001:05:09 0 0 41 2 000:41:02 0 4 59 53 004:59:53 0 0 41 6 000:41:06 0 4 59 20 004:59:20 0 0 56 1 000:56:01 0 0 26 31 000:26:31 0 6 10 3 006:10:03 0 0 40 1 000:40:01 0 4 59 53 004:59:53 0 6 3 27 006:03:27 0 6 3 7 006:03:07 0 1 5 57 001:05:58 10 250 28 21 250:28:21 10 250 18 37 250:18:37 0 4 58 42 004:58:43  
       
      Alguem poderia me dar uma força
       
    • Por gcors88
      Prezados, desenvolvi um gatilho onde este tem comunicação com outra tabela, uma é a coleta_sinal_vital, e onde o gatilho foi criado é na table  itcoleta_sinal_vital ( esta possui uma fk da primeira), a questão é que dentro do gatilho realizo um select na primeira tabela para consultar o valor inserido em uma coluna da primeira tabela, faço essa consulta baseada nessa fk que esta sendo inserida ou seja where = :new.cd_coleta_sinal_vital, a questão é que no momento em que esse select é executado ele não retorna dado nenhum, acredito que isto ocorre porque a inserção em ambas as tabelas é feito de forma simultânea, pois se comparado posteriormente o valor da coluna sempre é inserido, gostaria de saber se existe alguma forma de aplicar uma espera ou atraso neste gatilho para que ele possa capturar este valor sem problemas, grato!
    • Por msr1990
      ... o procedimento deverá atualizar os campos "quantmsgnaolidas" e "quantamigosativos", existentes na tabela de usuários. Cada um destes campos está relacionado de forma indireta as tabelas de mensagem e amigos.
       
      Deverá ser postado um arquivo em formato TXT ou DOC contendo o código em ORACLE do procedimento criado.
       
      Alguém pode me ajudar por favor? :)

    • Por asacap1000
      Salve galera estou com um problema em uma consulta no banco de dados.
      Preciso trazer um xml de um campo porém tem alguns lançamentos que estão com mais de 4000 caracteres, estou usando para a pesquisa o seguinte select
       
      SELECT ID_WS_GATEWAY, ID_WS_CONFIG, STATUS, ERRCODE, ERRMSG, FOLDER, FILENAME, DATE_IN, DATE_ON, SITE, WS, DBMS_LOB.SUBSTR(T.XMLDATA.getClobVal(),4000,1) XMLDATA, DIRECTION FROM WS_GATEWAY T Tem alguma outra forma de buscar uma quantidade maior neste campo?
       
       
    • Por devenr
      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á!
×

Informação importante

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