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:
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
War diese Frage in Bezug auf meine CLOB-Technik gemeint? Dort hab ich doch gar keinen DBMS_LOB benutzt?
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
Funktioniert prima !
mfG Dirk Lippens
Kommentar veröffentlichen