Ir para conteúdo

POWERED BY:

Arquivado

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

billy_ssa

INSERT de campo tipo CLOB

Recommended Posts

Pessoal,Estou precisando de ajuda, pois estou tentando fazer um insert de dados em um campo do tipo CLOB (ORACLE), tive que usar este tipo pois ele aceita até 4GB de informações, e está dando erro, informando que a string é muito longa para inserção.Alguém tem alguma idéia como posso resolver?Grato,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passa seu comando de INSERT e o erro que o Oracle te retorno.

 

Outro problema que poderá ocorres também é o tipo de CharacterSet que está no seu banco de dados com o CharacterSet National configurada.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá alphamek, também estou com o mesmo problema. O comando é:INSERT INTO TESTE(COLUNA_LOB) VALUES ('AAAAAAAAAAAAA...');Retorno: ORA-01704: literal de string extenso demais. Quando o valor possui até 4000 caracteres ele insere normal. Se eu colocar 4001 o erro já ocorre.Como poderei verificar o CharacterSet? E caso esteja configurado CharacterSet National para qual devo alterar?Abraços e obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,Consegui achar este código navegando na NET e o insert funcionou:O exemplo ocorre em um tabela que possui os campos:X: NumberY: ClobÉ necessário antes de executar o INSERT utilizar a função "empty_clob()", conforme abaixo:create or replace procedure p( p_x in int, p_new_text in varchar2 )as l_clob clob;begin insert into teste values ( p_x, empty_clob() ) returning descricao into l_clob; dbms_lob.write( l_clob, length(p_new_text), 1, p_new_text );end;E, a chamada da procedure fica da seguinte forma:p(1, "Aqui é o campo CLOB.")Mas, agora estou com problemas com o SELECT pois quando passa de 4000 caracteres eu recebo uma mensagem de erro:ORA-06502:PL/SQL: numeric or value error: character string buffer to smallORA-06512: at line 1O comando que estou executando é:SELECT DBMS_LOB.SUBSTR(TRIM(campo_clob), 32000, 1) FROM TABELASe puderem me dar alguma ajuda...Valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Billy,

 

você esta tentando usar esse comando select onde?

Em alguma PL-SQL?

 

Se pode tentar fazer o seguinte, se for um comando para uma PL_SQL tenta usar o script abaixo:

 

SET SERVEROUTPUT ON SIZE 1000000

DECLARE

var_tamanhoDoCampo VARCHAR2(32000);

BEGIN

SELECT DBMS_LOB.SUBSTR(TRIM(campo_clob), 32000, 1) INTO var_tamanhoDoCampo

FROM TABELA;

 

DBMS_OUTPUT.PUT_LINE('O resultado do select e: ' || var_tamanhoDoCampo);

 

END;

/

 

 

Acho que com esse script ajudara a resolver seu problema,

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando for fazer um SELECT nos CLOBS, abra um cursor Dinamico para conseguir vasculhar as colunas CLOB.

 

 

Faça com auxilio do pacote DBMS_LOB, senão terá problemas.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/shifty.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhorando minha explicação anterior.

 

sempre utilizem o PACOTE DBMS_LOB para manipular dados.

 

Alguns exemplinhos para melhorar nosso aprendizagem.

 

    CREATE TABLE TRodrigo     (           LobId               NUMBER(3),                Musicas            BLOB DEFAULT empty_blob(),                Documentos     CLOB DEFAULT NULL,                Arquivos           BFILE DEFAULT NULL);
Colocando dados em LobId.

 

  DECLARE              contador INTEGER;       BEGIN        contador:= 1;         WHILE contador <= 10 LOOP              INSERT INTO TRodrigo (LobId) VALUES (contador);              contador := contador + 1;         END LOOP; END; /  
Exemplo de comando UPDATE com valores nulos:

 

   UPDATE TRodrigo SET Musicas=empty_blob(),                                      Documentos = empty_clob()    WHERE LobId=1;
Agora vamos popular nossa tabelinha.

 

Eu preciso inicializar ela com um valor nulo.

 

SQL> UPDATE TRodrigo SET Documentos = empty_clob() where LobId = 1;
Agora que atualizei minha coluna Documentos (CLOB) vou consultar o tamanho dessa coluna, no registro 1 (LobId)

 

SQL> select dbms_lob.getlength(Documentos) from TRodrigo where LobId = 1;
Irá aparecer que minha coluna é de tamanho 0

 

Agora, vou inserir dados nessa coluna num scriptizinho que vou fazer em PL/SQL, só para ilustração.

 

 DECLARE           lobloc CLOB;           buffer VARCHAR2(32000);           total NUMBER := 20;           offset NUMBER := 1;      BEGIN          buffer := 'Rodrigo Almeida | www.rodrigoalmeida.com.br';     total := length(buffer);           dbms_output.put_line(buffer);           dbms_output.put_line(to_char(amount));           SELECT Documentos            INTO lobloc               FROM TRodrigo             WHERE LobId = 1 FOR UPDATE;             dbms_lob.write(lobloc,total,1,buffer);               COMMIT;         END;         /
Detalhe, a linha (dbms_lob.write(lobloc,total,1,buffer) ;) é a responsável pela gravação dos dados que estão no meu buffer.

 

Agora faça o seguinte:

 

SQL> SELECT dbms_lob.getlength(Documentos)               FROM TRodrigo WHERE LobId= 1;    
E PRONTO! Inserimos os dados.

 

Meu conselho é sempre utilizar as funções do pacote DBMS_LOB para manusear essas dados.

 

Caso queira ler os dados, use a função READ

 

    BEGIN      SELECT Documentos                 INTO lobloc       FROM TRodrigo             WHERE LobId = 1;           dbms_lob.read(lobloc,total,offset,buffer);         totalbuffer := length(buffer);           dbms_output.put_line(buffer);           dbms_output.put_line(to_char(totalbuffer));    END;  /
O esquema para manusear os dados são sempre os mesmo, o que pode mudar é sua utilização (INSERT/UPDATE/DELETE) na aplicação. Para isso tô colocando um muralzinho de funções do DBMS_LOB para ficar melhor.

 

 

APPEND() - append the contents of the source LOB to the destination

LOB COPY() - copy all or part of the source LOB to the destination LOB ERASE() - erase all or part of a LOB

LOADFROMFILE() - load BFILE data into an internal LOB

TRIM() - trim the LOB value to the specified shorter length

WRITE() - write data to the LOB from a specified offset

COMPARE() - comapre two entire or part of two lobs

GETLENGTH() - get the length of the LOB value

INSTR() - return the matching position of the nth occurrence of the pattern in the LOB

READ() - read data from the LOB starting at the specified offset

SUBSTR() - return part of the LOB value starting at the fied offset

 

PARA COLUNAS DO TIPO BFILES (Arquivos)

 

FILECLOSE() - close the file

FILECLOSEALL()- close all previously opened files FILEEXISTS() - check if the file exists on the server

FILEGETNAME() - get the directory alias and file name

FILEISOPEN() - check if the file was opened using the input BFILE locators

FILEOPEN() - open a file

 

Existe também uma série de colunas que eu escrevi aqui para a iMasters.

 

LOBS - Parte 1

LOBS - parte 2

LOBS - Parte 3

 

Belezinha........

 

http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alphamek,Eu entendi a questão sobre a utilização das funções para o tipo LOB, mas quando executo o comando abaixo ele não apresenta o dado.DECLARE lobloc CLOB; buffer VARCHAR2(32000); total NUMBER := 20; totalbuffer NUMBER := 20; offset NUMBER := 1; BEGIN SELECT decl_tx_declaracao INTO lobloc FROM og34.declaracao WHERE trat_cd_ocorrencia = 412005; dbms_lob.read(lobloc,total,offset,buffer); totalbuffer := length(buffer); dbms_output.put_line(buffer); dbms_output.put_line(to_char(totalbuffer)); END;Não é apresentado o resultado da query. Creio que não entendi o resultado das linhas: dbms_output.put_line(buffer); dbms_output.put_line(to_char(totalbuffer));Elas escrevem em um arquivo?Porque o meu problema é que preciso do retorno da query em um recordset de uma página ASP.Valeu mesmo pela força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hummmmmmmmmmmmmm... ASP ASP ASP...

 

O exemplo que passei, era para trabalhar dentro do banco de dados, PLZÃO!

 

No ASP as coisas muda, primeiramente, existe algumas restrições?

 

Primeira pergunta.

 

Tu está utilizando que tipo de conexão com o banco de dados?

 

O oracle é totalmente restrito com conexões do tipo ADO, OLEDB e ODBC, muitos recursos ficam limitados nele.

 

Por isso, a Oracle criou uma conexão especial, chamada Method OO4O

 

Se for nas colunas Oracle da iMasters, escrevi uma série de colunas ensinando a trabalhar com os recusros do Oracle, principalmente a parte de Lobs.

 

Para cada RecordSet criado, existe uma função de tratamente para o tipo de dados que está sendo passado, senão, suas colunas poderão de vários ??????? como registros guardados.

 

Procure saber mais sobre o assunto, que é bem legal e irá conseguir dar uma LUZ pra ti. Belezinha.

 

Abraços manow.

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alphamek, beleza?

 

te perguntar, nesse modelo ele ta inserindo, eu queria fazer uma procedure que retorna o arquizo armazenado no banco(blob)

 

ja tentei fazer o processo ao contrario e ja to com dois dias de buscas inscessantes pelo google.

e a maioria dos resultados incluindo as materias que você publicou no imasters so mostra retornando tipo clob e ainda no proprio sql*plus.

 

versão do banco 9i 9.2.0.1

 

 

pode me ajudar?

 

 

 

Grato

Alexandre

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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