- Este tópico contém 10 respostas, 3 vozes e foi atualizado pela última vez 10 anos, 6 meses atrás por Fábio Prado.
-
AutorPosts
-
25 de abril de 2014 às 10:08 pm #106571Leandro Miozzo BonatoParticipante
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.
25 de abril de 2014 às 11:18 pm #106572rmanParticipante@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?
26 de abril de 2014 às 1:58 am #106573Fábio PradoParticipante@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.net28 de abril de 2014 às 9:48 pm #106575Leandro Miozzo BonatoParticipanteConsegui 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.
7 de maio de 2014 às 11:59 pm #106599Leandro Miozzo BonatoParticipanteBoa 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;
8 de maio de 2014 às 3:09 pm #106600Fábio PradoParticipanteLeandro, 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
8 de maio de 2014 às 3:13 pm #106601rmanParticipante@leandro miozzo bonato
Qual é o tipo do campo DETAIL e CAMPO?
8 de maio de 2014 às 3:48 pm #106602Leandro Miozzo BonatoParticipante@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;
14 de maio de 2014 às 2:46 am #106620Fábio PradoParticipante@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
14 de maio de 2014 às 5:36 pm #106621Leandro Miozzo BonatoParticipanteBom dia, fechou Fábio, ficou show de bola funcionou direitinho. Obrigado a todos.
15 de maio de 2014 às 11:58 pm #106627Fábio PradoParticipanteLeandro, que bom que funcionou!
[]s
-
AutorPosts
- Você deve fazer login para responder a este tópico.