Inserindo textos longos e CLOB

Certamente alguns programadores, DBAs ou administradores de sistema já se depararam com este medonho problema.

Vamos aos fatos, CLOB não é um VARCHAR2!!!! ele é um objeto binário, mais precisamente uma lista de chars. ( repita comigo, CLOB não é VARCHAR! )

😉

Porém um jovenzinho(a) preguiçoso poderia facilmente inserir um VARCHAR2 dentro de uma coluna CLOB, o que realmente funcionaria, porém esta não é uma estratégia segura.

Lembre-se que o Oracle sempre faz os typecasts , qdo possivel, nos valores de INSERT / SELECT / UPDATE / ETC. Logo, na instruçao insert abaixo, ele converteria o texto ‘CLOB TEXT’ para CLOB e pronto 🙂

CREATE TABLE TEMP(
  VCHAR2 VARCHAR2(4000),
  CE_LOBE CLOB
);
INSERT INTO TEMP VALUES ('VARCHAR2 TEXT ','CLOB TEXT') ;

Lindo, prático e rápido.

Se for uma atuaçao pontual no banco este insert resolveria, mas agora imagine que seu ‘CLOB TEXT’ poderia ser qquer coisa maior do que este pequeno texto!

Entao, meu prezado, vamos imaginar que seu texto ‘CLOB TEXT’ seja maior do que 4000 caracteres:

INSERT INTO TEMP VALUES ('VARCHAR2 TEXT ',) ;

Como prêmio você receberia o seguinte “Error report” ( fora a tirada de sarro de seu coleguinha do lado, se você tiver um coleguinha e não for um trabalhador solitário ) :

Error report:
SQL Error: ORA-01704: literal de string extenso demais
01704. 00000 -  "string literal too long"
*Cause:    The string literal is longer than 4000 characters.
*Action:   Use a string literal of at most 4000 characters.
           Longer values may only be entered using bind variables.

Como resolvo isto?

Bem, para resolvermos este pequeno detalhe temos duas alternativas( talvez mais ):

Programar sua queries ( caso voce seja um programador ) para usar variaveis de bind ( :NOMEVARIAVEL ) ou usar um bloco anonimo para fazer a inserção, mais ou menos como o demonstrado abaixo:

DECLARE
  meuTextoGigante CLOB := '< insira aqui seu texto absurdamente grande, e nao se preocupe com as
quebras
de
linha  >';
BEGIN
  INSERT INTO TEMP VALUES ('MAGIC VALUE hohoho',meuTextoGigante);
END;

SELECT * FROM TEMP;

Como você pode observar, declarei uma variável como CLOB e na sequência já defini um valor para ela. Este valor pode conter quebras de linha, caracteres diferentes e tome muito cuidado com os ‘&’ pois vão se tornar variaveis extras no seu texto.

Acho que é só. Problema resolvido, todos felizes e vamos continuar estudando algumas coisas para postar algo novo para vocês 🙂

3 comentários sobre “Inserindo textos longos e CLOB”

  1. Olá!

    Gostei muito do seu post, e você explica bem…
    Estou fazendo uma pesquisa de inovaões de comando de CLOB no Oracle 11g, você teria alguma dica para mim?

    Obrigada!

    1. Oi Miyuki!

      Olha, as únicas coisas que vi no Oracle 11g em questão de melhorias foram incrementos no gerenciamento de memória ( que agora é quase 100% automatizado ), facilidades para a criação de cluster ( RAC ) e aumento de consumo de processamento ( hehehe ).

      Sobre clob, acredito que uma melhoria que aconteceu ( ou deve ter acontecido ) é o melhor gerenciamento do número de chars. No oracle 10g eu tive alguns problemas inserindo CLOBS com mais de 30000 caracteres, acredito que no 11g já nao existam tais problemas.

      at.
      Dart

  2. Tentei isso e não deu certo… ele me dá um erro bizarro [Error Code: 6550, SQL State: 65000] ORA-06550: linha 2, coluna 37:
    PLS-00103: Encountered the symbol “end-of-file” when expecting one of the following:

    Já não sei mais o que fazer… estou travado!

Deixe uma resposta