21. Juli 2006

CLOB's in Forms 6i

Der neue Datentyp CLOB wird in Oracle Forms 6i noch nicht unterstützt.

Erfinden wir doch einfach einen Workaround !

Voraussetzung: Tabelle EMP ist in der DB und hat eine Spalte Note_CLOB, es gibt eine Maske mit dem Block EMP und allen Spalten ausser dem CLOB.

Anforderung: Der CLOB soll aus der DB gelesen und angezeigt werden. Desweiteren soll er editierbar sein

Zuerst erstellen wir ein Textitem "Note_CLOB" im Block EMP:

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

Item-Trigger:
- WHEN-VALIDATE-ITEM
:EMP.EMPNO := :EMP.EMPNO;

Block-Trigger:
- POST-QUERY
POQ_EMP;

- PRE-UPDATE
PRU_EMP;

Diese Prozeduren werden in der Maske benötigt

PROCEDURE POQ_EMP IS
V_String VARCHAR2 (1000);
V_Index NUMBER := 0;
BEGIN
LOOP
V_String := Read_CLOB (:EMP.EMPNO, V_Index);
IF V_String IS NOT NULL THEN
:EMP.Note_CLOB := :EMP.Note_CLOB || V_String;
V_Index := V_Index + 1;
ELSE
EXIT;
END IF;
END LOOP;
END;

PROCEDURE PRU_EMP IS
V_String VARCHAR2 (1000);
V_Index NUMBER := 0
BEGIN
Clear_CLOB (:EMP.EMPNO);
LOOP
V_String := Substr (:EMP.Note_CLOB, 1 + V_Index * 1000, 1000);
IF V_String IS NOT NULL THEN
Append_CLOB (:EMP.EMPNO, V_String);
V_Index := V_Index + 1;
ELSE
EXIT;
END IF;
END LOOP;
END;


Diese Prozedur liegt in der Datenbank


PROCEDURE CLEAR_CLOB (P_EMPNO IN EMP.EMPNO%TYPE) IS
BEGIN
UPDATE EMP SET Note_CLOB = NULL
WHERE EMPNO = P_EMPNO;
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 READ_CLOB (P_EMPNO IN EMP.EMPNO%TYPE, P_INDEX IN NUMBER) RETURN VARCHAR2 IS
V_STRING VARCHAR2 (2000);
BEGIN
SELECT SUBSTR (Note_CLOB, 1 + P_Index * 1000, 1000)
INTO V_String
FROM EMP
WHERE EMPNO = P_EMPNO;
RETURN (V_String);
END;

mit dieser Technik kann man aus einem CLOB die ersten 32 KB auslesen und verändern. Bei grösseren CLOB geht dies nicht.

versuche und teste es !

4 Kommentare:

Anonym hat gesagt…

Für die Zuweisung

v_string := substr(lob_feld,1,4000)
bekomme ich die Fehlermeldung :
"Falsche Anzahl oder Type für substr".

Geht das ohne das Package "dbms_lob" !

mfG Dirk Lippens

Gerd Volberg hat gesagt…

War diese Frage in Bezug auf meine CLOB-Technik gemeint? Dort hab ich doch gar keinen DBMS_LOB benutzt?

Anonym hat gesagt…

Vielen Dank für die Antwort !

Ich habe fälschlicherweise
die Funktion "read_clob" in Forms6i angelegt.
Die gehört in die Datenbank, dass hatten Sie ja auch so dokumentiert.

Die Funktion "substr" in der Forms-Engine ist wohl nicht so schlau wie
die Funktion "substr" in der (11er) Datenbank.

mfG Dirk Lippens

Anonym hat gesagt…

Funktioniert prima !

mfG Dirk Lippens