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
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:
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:
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.