billy_ssa 0 Denunciar post Postado Abril 16, 2005 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
alphamek 2 Denunciar post Postado Abril 17, 2005 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
Rubones 0 Denunciar post Postado Abril 24, 2005 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
billy_ssa 0 Denunciar post Postado Abril 24, 2005 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
MonTiLLa 1 Denunciar post Postado Abril 25, 2005 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
alphamek 2 Denunciar post Postado Abril 27, 2005 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
alphamek 2 Denunciar post Postado Abril 27, 2005 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
billy_ssa 0 Denunciar post Postado Maio 2, 2005 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
alphamek 2 Denunciar post Postado Maio 3, 2005 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
Fabio Lody 7 Denunciar post Postado Maio 4, 2005 :blink: aperta eject alfamequi Compartilhar este post Link para o post Compartilhar em outros sites
alphamek 2 Denunciar post Postado Maio 4, 2005 Já apertei... hehehehehehehehehehehehehehehe Embassadooooo. :( Compartilhar este post Link para o post Compartilhar em outros sites
alixandre 0 Denunciar post Postado Dezembro 6, 2007 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