lunes, 27 de septiembre de 2010

Insert sobre una columna CLOB

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

4 comentarios:

  1. 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,
    CLOB 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)

    ResponderEliminar
  2. 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:
    http://knowledgebase.progress.com/articles/Article/3380

    ResponderEliminar
  3. Espero que os puedan servir, es para meter en un CLOB los registros concatenados de otra tabla.


    Function 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;

    ResponderEliminar
  4. 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