Jump to content
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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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);
 

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 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á!
    • By devenr
      Estou com dificuldade na criação de uma procedure que receba três valores numéricos e insira um registro na tabela abaixo:
       
       
      TB_MAIORES NUMERO1 Primeiro valor NUMERO2 Segundo valor NUMERO3 Terceiro valor MAIOR Maior valor entre (NUMERO1, NUMERO2 e NUMERO3)
    • By fabissilva
      desenvolvi em PL / SQL uma procedure que envia email que está funcionando perfeitamente. Porém foi mudado o servidor de email para Gmail, que requer autenticação e o tipo de conexão é SSL. Poderiam me ajudar com essas alterações?
      A versão do banco de dados é o 11.


      CREATE OR REPLACE PROCEDURE PRC_JUN_SEND_MAIL
      (
      TO_NAME VARCHAR2,
      SUBJECT VARCHAR2,
      MESSAGE VARCHAR2
      )
      IS
      L_BODY VARCHAR2(32767);

      L_MAILHOST VARCHAR2(64) := ''smtp.gmail.com'';
      P_USERNAME_ VARCHAR2(50) := ''admin@jun.net'';
      P_PASSWORD_ VARCHAR2(50) := ''***********'';
      L_DE VARCHAR2(64) := ''Remetente'';
      L_FROM VARCHAR2(64) := ''admin@jun.net'';
      l_port VARCHAR(7) := ''587'';
      L_MAIL_CONN UTL_SMTP.CONNECTION;


      BEGIN
      L_MAIL_CONN := UTL_SMTP.OPEN_CONNECTION(L_MAILHOST,l_port);
      Dbms_Output.Put_Line (''apos conectar'');
      UTL_SMTP.HELO(L_MAIL_CONN, L_MAILHOST);

      Dbms_Output.Put_Line (''hello'');
      UTL_SMTP.COMMAND (L_MAIL_CONN, ''AUTH LOGIN'');
      Dbms_Output.Put_Line (''AUTH LOGIN'');
      UTL_SMTP.COMMAND (L_MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2(
      UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_USERNAME_))));
      UTL_SMTP.COMMAND (L_MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2( UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_PASSWORD_))));
      UTL_SMTP.MAIL(L_MAIL_CONN, L_FROM);
      UTL_SMTP.RCPT(L_MAIL_CONN, TO_NAME);

      UTL_SMTP.OPEN_DATA(L_MAIL_CONN);

      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''FROM:'' ||L_DE||''<''|| L_FROM|| ''>'' || UTL_TCP.CRLF));
      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''TO:'' ||TO_NAME||UTL_TCP.CRLF));
      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''SUBJECT:'' ||SUBJECT||UTL_TCP.CRLF));
      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''CONTENT-TYPE: TEXT/HTML; CHARSET=ISO-8859-1''||UTL_TCP.CRLF));
      UTL_SMTP.WRITE_DATA(L_MAIL_CONN, '' ''||UTL_TCP.CRLF);

      UTL_SMTP.WRITE_RAW_DATA(L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(UTL_TCP.CRLF||MESSAGE));

      UTL_SMTP.CLOSE_DATA(L_MAIL_CONN);

      UTL_SMTP.QUIT(L_MAIL_CONN);
      END;
    • By asacap1000
      Galera estou com uma consulta que ainda não consegui entender o porque. gostaria que ela trouxesse em apenas uma linha mas não vem de forma alguma.
       
      SELECT BO.LAGER, BO.ID_OS, K.ID_KLIENT, K.SUCHBEGRIFF CNPJ_CPF, K.NAME, BI.DIV_1 LOTE, BI.DIV_10 DI_DDE, (SELECT DISTINCT DIS.ID_DISPATCHER FROM FISCAL.DOCHD DC, WMS_EADI.DISPATCHER DIS WHERE DC.DOCHD_DOC_ID = BO.NR_NF AND DC.DOCHD_RPS_DESP = DIS.SUCHBEGRIFF) COD_COMISSARIA, (SELECT DISTINCT DIS.BEZ FROM FISCAL.DOCHD DC, WMS_EADI.DISPATCHER DIS WHERE DC.DOCHD_DOC_ID = BO.NR_NF AND DC.DOCHD_RPS_DESP = DIS.SUCHBEGRIFF) COMISSARIA, BO.NR_NF, BO.DATE_BILL, BO.DATE_EMISS, --------ABAIXO OS TIPOS DE SERVIÇOS ONDE ESTÃO OCORRENDO CADA RESULTADO ELE CRIA UMA LINHA---------------- (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'ARMAZ')) VLR_ARMAZ, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'GER.RISCO')) VLR_GER_RISCO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'MOVIMENT')) VLR_MOVIMENTACAO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'DESUNIT')) VLR_DESUNIT, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'PESAGEM')) VLR_PESAGEM, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT LIKE 'AVERBA%')) VLR_AVERBACAO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'FAT.MINIMO.')) VLR_FAT_MINIMO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND BLL.BILLITE NOT IN ('21.02', '21.03') AND WER.WERT = 'OUT.SERV.')) VLR_OUTROS_SERV, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND BLL.BILLITE = '21.02' AND WER.WERT = 'OUT.SERV.')) TRANSF_IN, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND BLL.BILLITE = '21.03' AND WER.WERT = 'OUT.SERV.')) TRANSF_OUT FROM BILL_OS BO, BILL_OS_ITEM BI, KLIENTEN K WHERE BO.LAGER = BI.LAGER AND BO.ID_KLIENT = BI.ID_KLIENT AND BO.ID_OS = BI.ID_OS AND BO.LAGER = K.LAGER AND BO.ID_KLIENT = K.ID_KLIENT and k.id_klient = '3099' and BO.NR_NF = '121304' AND BO.STATUS = '90' AND TRUNC(BO.DATE_BILL) BETWEEN '28/08/2019' AND '28/08/2019' GROUP BY BO.LAGER, BO.ID_OS, K.ID_KLIENT, K.SUCHBEGRIFF, K.NAME, BO.DATE_EMISS, BO.NR_NF, BO.DATE_BILL, BI.BILLITE, BI.DIV_1, BI.DIV_10
       
      Alguem consegue identificar neste select porque ele vem assim?
×

Important Information

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