Paso 1) Creamos una tabla modo de prueba (que contenga una columna CLOB)
SQL> CREATE TABLE prueba
2 (titulo VARCHAR2(40),
3 author VARCHAR2(40),
4 texto CLOB);
Table created.
Paso 2) Realizamos el insert que queremos realizar, llamando a la función EMPTY_CLOB() la cual deja un puntero vacio a un objeto CLOB.
SQL> INSERT INTO prueba VALUES ('Hobbit','Tolkien',EMPTY_CLOB());
1 row created.
SQL> commit;
Paso 3) Updeteamos la columna CLOB utilizando PL/SQL
DECLARE
my_text_handle CLOB;
my_buffer VARCHAR2(32767);
my_add_amt NUMBER := 0;
my_offset INTEGER := 1;
BEGIN
my_buffer := 'prueba con clob';
my_add_amt := length(my_buffer);
SELECT text
INTO my_text_handle
FROM prueba
WHERE title = 'Hobbit' FOR UPDATE;
DBMS_LOB.WRITE(my_text_handle, my_add_amt, my_offset, my_buffer);
COMMIT;
END;
PL/SQL procedure successfully completed.
SQL> select texto from prueba;
TEXT
-----------------------
Prueba con clob
Espero les haya servido
Saludos!
Gondalf
No se si todavia sigas este post que creaste tengo un problema para hacer un insert en una tabla utilizando CLOB, lo estoy haciendo con Hibernet y Oracle, el mapeo de las tablas el tipo de dato lo toma como CLOB, entonces trato de converir lo que el usuario captura a CLOB setearlo a la entidad y darle em.persist pero al hacer esto me devuelve un error "ORA-22922": valor LOB no existente,
ResponderEliminarCLOB temp = CLOB.createTemporary(jdbcConnection, true, CLOB.DURATION_SESSION); CLOB in readwrite mode temp.open(CLOB.MODE_READWRITE);
tempClobWriter = temp.getCharacterOutputStream(); tempClobWriter.write(Strtexto);
tempClobWriter.flush();
tempClobWriter.close();
temp.close(); entidad.setDatoCLOB(temp);
em.persist(entidad)
Perdon pero no habia visto tu pregunta... calculo que encontraste la solucion pero por las dudas, investigando vi que esta pagina creo que tiene lo que necesitas:
ResponderEliminarhttp://knowledgebase.progress.com/articles/Article/3380
Espero que os puedan servir, es para meter en un CLOB los registros concatenados de otra tabla.
ResponderEliminarFunction VARCHAR2CLOB (Cadena VARCHAR2) Return CLOB Is
LocalLob CLOB;
Buffer VARCHAR2(32767);
Amount NUMBER;
Offset NUMBER;
Begin
DBMS_LOB.CREATETEMPORARY(LocalLob,TRUE,DBMS_LOB.SESSION);
Buffer := Cadena;
Amount := LENGTH(Buffer);
Offset := 1;
DBMS_LOB.WRITE(LocalLob,Amount,Offset,Buffer);
Return LocalLob;
Exception
When Others Then
Return Null;
End;
//
PROCEDURE PRUEBA_CARGA_CLOB
(
xnombre IN VARCHAR2,
RESULTADO OUT VARCHAR2
) AS
vCONTENIDO CLOB;
i number:= 0;
vMENSAJE_TXT CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(vMENSAJE_TXT,TRUE,DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(vCONTENIDO,TRUE,DBMS_LOB.SESSION);
FOR r IN (SELECT '*CAMPOS*' FROM TABLA) LOOP
i := i + 1;
DBMS_LOB.TRIM(vMENSAJE_TXT,0);
vMENSAJE_TXT := VARCHAR2CLOB(campo1||'··'||campo2||'··'||', '||CHR(13));
DBMS_LOB.APPEND(vCONTENIDO,vMENSAJE_TXT);
END LOOP ;
INSERT INTO PRUEBA_CLOB values (xnombre,vCONTENIDO);
commit;
END PRUEBA_CARGA_CLOB;
hola, me sirvió de mucho, pero tengo un cadena de texto demasiada larga mas que 32767, de pronto sabéis como me acepte un rango mas alto?, e estado buscando demasiado pero no he tenido éxito.
ResponderEliminar