Pular para o conteúdo
  • Este tópico contém 10 respostas, 3 vozes e foi atualizado pela última vez 10 anos, 6 meses atrás por Avatar de Fábio PradoFábio Prado.
Visualizando 11 posts - 1 até 11 (de 11 do total)
  • Autor
    Posts
  • #106571
    Avatar de Leandro Miozzo BonatoLeandro Miozzo Bonato
    Participante

      Boa tarde Srs, estou com um problema muito básico, porém está me deixando “malucão”, está acontecendo o seguinte erro:
      ORA-01704: literal de string extenso demais

      Beleza até ai, nenhuma novidade, o campo é grande demais para receber o texto que eu estou passando via comando “Insert”. Porém eu consigo efetuar o insert normalmente com uma instrução PL/SQL.

      MeuCampo é do Tipo CLOB Text.


      DECLARE
      NOVOVALOR VARCHAR2(32767) := 'Texto Muitooooo maior que 4000 caracteres';
      BEGIN
      INSERT INTO TEMP (MeuCampo) VALUES (NOVOVALOR);
      END;

      só que o objetivo não é inserir o campo 1 a 1 ou mesmo com um enquanto ou um para faça em um bloco anonimo de PL/SQL, o grande e maior problema é no futuro próximo por que a aplicação vai tentar inserir um texto maior que 4000 caracteres, por que é um campo de comentário, e eu não posso mudar na aplicação tem que ser no banco de dados. A minha necessidade é colocar esse bloco de PL/SQL com o tratamento para este campo, sempre quando ocorrer esta exceção, então resumindo, ocorreu a exceção do tamanho do campo faz o tratamento e insere o campo normal (por que este bloco PL/SQL faz isso).

      Nota: Já tentei usar trigger na tabela e não consegui, a exceção, digamos, ocorre antes de ativar a trigger (mesmo sendo before insert).

      Obrigado a todos.

      #106572
      Avatar de rmanrman
      Participante

        @leandro miozzo bonato

        A aplicação é em qual linguagem? Você tem acesso para alterar o código da aplicação? Como é feito o INSERT que apresenta erro?

        #106573
        Avatar de Fábio PradoFábio Prado
        Participante

          @leandro miozzo bonato

          A melhor forma de evitar isso é alterar a aplicação, mas como vc não pode fazer isso, vc poderia criar uma gambiarra através de uma trigger before insert com transação autonoma, onde vc verifica o tamanho da coluna e qdo for maior q 4000 substitua por outro INSERT truncando o valor do campo, faça um commit em seguida, e por fim, dispare uma exceção explicita dentro da trigger. Isso é uma baita gambiarra, mas resolve o problema!

          Se vc não souber como criar trigger before com transação autonoma, dê uma olhada no fórum glufke.net/oracle que lá vc encontrará exemplos!

          []s

          Fábio Prado
          http://www.fabioprado.net

          #106575
          Avatar de Leandro Miozzo BonatoLeandro Miozzo Bonato
          Participante

            Consegui alguns tutoriais na net referente ao assunto, vou ver se consigo fazer no decorrer da semana. Informarei caso tenha dúvidas ou fecharei o tópico. Muito obrigado as duas respostas.

            #106599
            Avatar de Leandro Miozzo BonatoLeandro Miozzo Bonato
            Participante

              Boa tarde Srs, não deu certo, favor verificar o código que eu utilizei e o por que não deu certo =/. Obrigado desde já.


              create or replace trigger TG_ITEMS BEFORE INSERT ON ITEMS FOR EACH ROW
              DECLARE
              PRAGMA AUTONOMOUS_TRANSACTION;
              NOVOVALOR VARCHAR2(32767) := '';
              BEGIN
              IF LENGTH(:NEW.DETAIL) > 4000 THEN
              NOVOVALOR := :NEW.CAMPO;
              INSERT INTO ITEMS (CAMPO)
              VALUES (NOVOVALOR);
              COMMIT;
              RAISE_APPLICATION_ERROR(-20100, '');
              END IF;
              END;

              #106600
              Avatar de Fábio PradoFábio Prado
              Participante

                Leandro, seu código tem 1 pequeno erro de lógica e vc esqueceu de truncar o NEW.DETAIL. Veja o exemplo abaixo:


                create or replace trigger TG_ITEMS BEFORE INSERT ON ITEMS FOR EACH ROW
                DECLARE
                PRAGMA AUTONOMOUS_TRANSACTION;
                NOVOVALOR VARCHAR2(32767) := '';
                BEGIN
                IF LENGTH(:NEW.DETAIL) > 4000 THEN
                NOVOVALOR := SUBSTR(:NEW.DETAIL,1,4000);
                INSERT INTO ITEMS (CAMPO)
                VALUES (NOVOVALOR);
                COMMIT;
                RAISE_APPLICATION_ERROR(-20100, '');
                END IF;
                END;

                Agora lembre-se que se a tabela tiver mais colunas você tem que inserir valor em todas elas no comando INSERT, ok?

                []s

                #106601
                Avatar de rmanrman
                Participante

                  @leandro miozzo bonato

                  Qual é o tipo do campo DETAIL e CAMPO?

                  #106602
                  Avatar de Leandro Miozzo BonatoLeandro Miozzo Bonato
                  Participante

                    @Fabio
                    Eu tentei efetuar desta maneira, de acordo com o que você me passou, eu acredito que você esteja se referindo as demais colunas que eu não possa utilizar o :new da forma como eu estou utilizando abaixo, no caso eu terei que inserir em uma nova variável para cada coluna?? Seria isso que você se referia ou não tem problema se eu utilizar o :New??

                    @Fabio
                    Uma outra dúvida Fabio em sua resposta, você colocou no campo SUBSTR(:NEW.DETAIL,1,4000), se caso esse campo for maior que os 4000 caracteres a função SUBSTR não irá cortar o VARCHAR??

                    @RMAN
                    O campo Detail e o Novo Campo é o mesmo, eu que me expressei mal ontem, mas obrigado pela resposta.

                    Segue o código abaixo, onde destaquei os campos em unico na linha de comando, para ficar mais fácil para identifica-los.
                    Nota: Não postei antes o código para tentar ser mais objetivo.

                    Obrigado!


                    create or replace
                    trigger TG_ITEMS BEFORE INSERT ON ITEMS FOR EACH ROW
                    DECLARE
                    PRAGMA AUTONOMOUS_TRANSACTION;
                    NOVOVALOR VARCHAR2(32767) := '';
                    BEGIN
                    IF LENGTH(:NEW.DETAIL) > 4000 THEN
                    NOVOVALOR := SUBSTR(:NEW.DETAIL,1,4000);
                    INSERT INTO ITEMS (ID,VERSION,TYPE,PARENT_ID,SPACE_ID,SEQUENCE_NUM,TIME_STAMP,
                    PLANNED_EFFORT,LOGGED_BY,ASSIGNED_TO,SUMMARY,
                    DETAIL,
                    STATUS,SEVERITY,PRIORITY,CUS_DBL_01,CUS_DBL_02,CUS_DBL_03,CUS_INT_01,
                    CUS_INT_02,CUS_INT_03,CUS_INT_04,CUS_INT_05,CUS_INT_06,
                    CUS_INT_07,CUS_INT_08,CUS_INT_09,CUS_INT_10,CUS_STR_01,
                    CUS_STR_02,CUS_STR_03,CUS_STR_04, CUS_STR_05,CUS_TIM_01,CUS_TIM_02,CUS_TIM_03)

                    VALUES (:NEW.ID,:NEW.VERSION,:NEW.PARENT_ID,:NEW.TYPE,:NEW.SPACE_ID,
                    :NEW.SEQUENCE_NUM,:NEW.TIME_STAMP, :NEW.PLANNED_EFFORT,
                    :NEW.LOGGED_BY,:NEW.ASSIGNED_TO, :NEW.SUMMARY,
                    NOVOVALOR,
                    :NEW.STATUS,:NEW.SEVERITY,:NEW.PRIORITY,:NEW.CUS_DBL_01, :NEW.CUS_DBL_02,:NEW.CUS_DBL_03,:NEW.CUS_INT_01,:NEW.CUS_INT_02, :NEW.CUS_INT_03,:NEW.CUS_INT_04,:NEW.CUS_INT_05,:NEW.CUS_INT_06, :NEW.CUS_INT_07,:NEW.CUS_INT_08,:NEW.CUS_INT_09,:NEW.CUS_INT_10, :NEW.CUS_STR_01,:NEW.CUS_STR_02,:NEW.CUS_STR_03,:NEW.CUS_STR_04, :NEW.CUS_STR_05,:NEW.CUS_TIM_01,:NEW.CUS_TIM_02,:NEW.CUS_TIM_03);
                    COMMIT;
                    RAISE_APPLICATION_ERROR(-20100, '');
                    END IF;
                    END;

                    #106620
                    Avatar de Fábio PradoFábio Prado
                    Participante

                      @leandro,

                      É difícil encontrar o erro no seu código, pois não tenho o seu ambiente e nem vou ter tempo hábil p/ analisar o seu problema, portanto, veja o código abaixo, que foi criado e testado (e funcionou) baseado no que eu havia lhe informado, entenda-o e faça as devidas alterações no seu ambiente.


                      -- Criando a tabela
                      CREATE TABLE TB_TESTE (ID NUMBER, DETAIL CLOB);

                      -- Criando a trigger
                      create or replace trigger TG_ITEMS BEFORE INSERT ON stbd.tb_teste FOR EACH ROW
                      DECLARE
                      PRAGMA AUTONOMOUS_TRANSACTION;
                      NOVOVALOR VARCHAR2(4000);
                      BEGIN
                      IF dbms_lob.GETLENGTH(:NEW.DETAIL) > 4000 THEN
                      NOVOVALOR := dbms_lob.SUBSTR(:NEW.DETAIL,4000,1);

                      INSERT INTO tb_teste (ID,detail) VALUES (:NEW.ID,NOVOVALOR);
                      COMMIT;
                      RAISE_APPLICATION_ERROR(-20100, 'Valor de detalhes foi truncado p/ 4000 caracteres');
                      

                      END IF;
                      END;
                      /

                      -- testando a trigger
                      declare
                      v_detail varchar2(32767);
                      begin
                      v_detail := 'fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio
                      fabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabiofabio';

                          insert into tb_teste (id, detail) values (1 , v_detail);        
                      

                      end;

                      []s

                      #106621
                      Avatar de Leandro Miozzo BonatoLeandro Miozzo Bonato
                      Participante

                        Bom dia, fechou Fábio, ficou show de bola funcionou direitinho. Obrigado a todos.

                        #106627
                        Avatar de Fábio PradoFábio Prado
                        Participante

                          Leandro, que bom que funcionou!

                          []s

                        Visualizando 11 posts - 1 até 11 (de 11 do total)
                        • Você deve fazer login para responder a este tópico.
                        plugins premium WordPress