Como Utilizar un CLOB desde Forms6i

Utilizar un tipo de dato CLOB en Oracle Forms 6i no es posible, por lo que no queda más que inventar una manera de emularlo.

 

En el ejemplo adjunto se asume que tenemos una tabla PERSONA con una columna en ella que se llama OBSERVACION_CLOB y una forma con un bloque PERSONA que contiene todas las columnas de la tabla sin el CLOB.

Lo que requerimos es que la columna CLOB de la tabla se pueda mostrar y editar desde la forma.

Paso 1.

Crear un textitem «OBSERVACION_CLOB» en el bloque PERSONA:

Item-Properties:
– Data Type CHAR
– Maximum Length 32000
– Database-Item No

Item-Trigger:
– WHEN-VALIDATE-ITEM

:PERSONA.CODIGO_PERSONA:= :PERSONA.CODIGO_PERSONA;

Block-Trigger:
– POST-QUERY

POQ_PERSONA;

– PRE-UPDATE

PRU_PERSONA;

Program units requerdias por la forma

PROCEDURE POQ_PERSONA IS
  V_HILERA   VARCHAR2 (1000);
  V_INDICE   NUMBER := 0;
BEGIN
  LOOP
    V_HILERA:= LEER_CLOB (:PERSONA.CODIGO_PERSONA, V_INDICE);
    IF V_HILERA IS NOT NULL THEN
      :PERSONA.OBSERVACION_CLOB := :PERSONA.OBSERVACION_CLOB || V_HILERA;
      V_INDICE:= V_INDICE+ 1;
    ELSE
      EXIT;
    END IF;
  END LOOP;
END;

PROCEDURE PRU_PERSONA IS
  V_HILERA   VARCHAR2 (1000);
  V_INDICE   NUMBER := 0
BEGIN
  LIMPIAR_CLOB (:PERSONA.CODIGO_PERSONA);
  LOOP
    V_HILERA := Substr (:PERSONA.OBSERVACION_CLOB, 1 + V_INDICE * 1000, 1000);
    IF V_HILERA IS NOT NULL THEN
      AGREGAR_CLOB (:PERSONA.CODIGO_PERSONA, V_HILERA);
      V_INDICE:= V_INDICE + 1;
    ELSE
      EXIT;
    END IF;
  END LOOP;
END;

Procedimientos requeridos a nivel de base de datos:

PROCEDURE LIMPIAR_CLOB (P_CODPERSONA IN PERSONA.CODIGO_PERSONA%TYPE) IS
BEGIN
  UPDATE PERSONA SET OBSERVACION_CLOB = NULL
   WHERE CODIGO_PERSONA = P_CODPERSONA;
END;

PROCEDURE APPEND_CLOB (P_EMPNO IN EMP.EMPNO%TYPE, P_STRING IN VARCHAR2) IS
BEGIN
  UPDATE EMP SET Note_CLOB = Note_CLOB || P_String
   WHERE EMPNO = P_EMPNO;
END;

FUNCTION LEER_CLOB (P_CODPERSONA IN PERSONA.CODIGO_PERSONA%TYPE, P_INDICE IN NUMBER) RETURN VARCHAR2 IS
  V_HILERA VARCHAR2 (2000);
BEGIN
  SELECT SUBSTR (OBSERVACION_CLOB, 1 + P_INDICE * 1000, 1000)
    INTO V_HILERA
    FROM PERSONA
   WHERE CODIGO_PERSONA = P_CODPERSONA;
  RETURN (V_HILERA);
END;

 

JulexFR