es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Oracle transforma los datos de prefijo en un CLOB mediante un procedimiento.

Tengo un procedimiento (ver caso de prueba a continuación) que funciona bien y que agrega datos a un CLOB. Además de agregar los datos en el CLOB, encapsulo el VALOR de SYSDATE en etiquetas para poder realizar un seguimiento de cuándo se actualizó la fecha de los datos en el CLOB.

Aunque solo estoy mostrando datos con 10-20 caracteres en mi ejemplo, el CLOB puede ser extremadamente grande y en muchos casos concatenado dentro de un bloque antes de colocarse en el CLOB.


ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS'; CREATE table t( seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL, c CLOB, create_date DATE DEFAULT SYSDATE ); insert into t (c) values (' ') CREATE OR REPLACE PROCEDURE lob_append( pclob IN OUT CLOB, ptext IN VARCHAR2 ) AS ltext varchar2(32760); ldate_string VARCHAR2(50); BEGIN select '[' || TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') || ']' into ldate_string from dual; -- newline each time code is appended for clarity. ltext :=chr(10) || ldate_string || chr(10) || ptext || chr(10) || ldate_string||chr(10); dbms_lob.writeappend(pclob, length(ltext), ltext ); END; DECLARE lclob CLOB := empty_clob(); lTime date; BEGIN lTime := sysdate; SELECT c INTO lclob FROM t WHERE seq_num = 1 FOR UPDATE; lob_append(lclob, rpad('Z',20,'Z')); loop exit when sysdate = lTime + interval '2' second; end loop; lclob := empty_clob(); SELECT c INTO lclob FROM t WHERE seq_num = 1 FOR UPDATE; lob_append(lclob, rpad('Y',10,'Y')); END; -- Note there can be any data, -- multiple lines, newlines, between the -- encapsulating tags SELECT * from t SEQ_NUM C CREATE_DATE 1 [12-01-2021 13:08:58] ZZZZZZZZZZZZZZZZZZZZ [12-01-2021 13:08:58] [12-01-2021 13:09:00] YYYYYYYYYY [12-01-2021 13:09:00] 12012021 13:08:58

Estoy buscando hacer algo como esto, pero llamando a un procedimiento similar al publicado anteriormente, pero quiero que los nuevos datos se agreguen al principio en lugar de agregarse y que estén encapsulados dentro de etiquetas SYSDATE.


UPDATE T SET C = RPAD('A',20,'A') || CHR(10) || C WHERE SEQ_NUM = 1
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado de agregar etiquetas SYSDATE a los nuevos datos, se puede realizar una modificación al procedimiento original. El procedimiento modificado sería el siguiente:

    CREATE OR REPLACE PROCEDURE lob_prepend(
      p_clob IN OUT CLOB,
      p_text IN     VARCHAR2
    )
    AS
      l_text varchar2(32760);
      l_date_string VARCHAR2(50);
      l_existing_length INTEGER;
    BEGIN
      select '[ ' || TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') || ' ]' || CHR(10)
      into l_date_string from dual;
    
      l_existing_length := dbms_lob.getlength(p_clob);
    
      -- agregar los datos del CLOB existente después de los nuevos datos
      l_text := l_date_string
              || p_text || chr(10)
              || substr(p_clob, 1, l_existing_length);
    
      dbms_lob.write(p_clob, length(l_text), 1, l_text );
    END;
    

    Este procedimiento agregará los nuevos datos con etiquetas SYSDATE y un carácter de nueva línea, seguido de los datos existentes en el CLOB. Los nuevos datos se insertarán al principio del CLOB.

    Para utilizar el procedimiento modificado, se puede emplear la siguiente sentencia SQL:

    DECLARE
      l_clob CLOB := empty_clob();
      lTime date;
    BEGIN
      lTime := sysdate;
    
      SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE;
    
      lob_prepend(l_clob, rpad('A',20,'A'));
    
      loop
        exit when sysdate = lTime + interval '2' second;
      end loop;
    
      l_clob  := empty_clob();
      SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE;
    
      lob_prepend(l_clob, rpad('B',10,'B'));
    END;
    /
    

    Esto actualizará la columna CLOB en la tabla T y añadirá una nueva línea de ‘AAAAA…’ seguida de otra línea de ‘BBBBB…’ con cada línea encapsulada en etiquetas SYSDATE.

Comments are closed.