Oracle 10g, data pump, SQL_FILE, schreibt Zeilen die länger 2499 Zeichen sind

planb2000

Erfahrenes Mitglied
Hallo,
Problem:
über data pump mechnismus erzeuge ich ein SQLFILE und schreibe diese in ein CLOB Feld einer Tabellenspalte.
Dieses sql file lade ich mir in eine Datei und führe dieses unter SQLPLUS mit :> @MeinScript.sql aus.
Der folgende Fehler, "SP2-0027: Input is too long (> 2499 characters) --> SQLPLUS kann nur maximale Zeilenlängen von 2499 Zeichen, tritt dann auf. In der Datei wurden Trigger/View Definitionen erzeugt deren Zeilenlänge > 2499 Zeichen sind.
Meine Frage/n (Ideen):
-- kann man in data pump die maximal Zeilenlänge angeben?
-- wie kann man eine Zeilenverkürzung im CLOB anhand eines Zeichens und der Länge vornehmen?
-- gibt es eine Methode auf CLOBS wie z.B prosa: "Prüfe Zeichen an Position, wenn die Position > 2499 und das zuletzt gelesene Zeichen ein "," ist füge Zeilenumbruch ein.)
-- Hat jemand einen weiteren Lösungsansatz(keine Option ist die Datei im sqldeveloper oder ähnlichem zu starten. Weitere, dahinterliegende Prozesse laufen alle scriptgesteuert)?


Vielen Dank vorab für Eure Hilfe
 
Hi,
da sqlplus ja die angegebene limitierung hat, mußten wir dafür sorgen die Zeilen zu kürzen.
Als Lösung haben wir jedes komma in dem clob mit
SQL:
 chr(10)||','
ersetzt. Dafür kann man das folgende Beispiel gut verwenden:
SQL:
 FUNCTION replaceClob

     ( srcClob IN CLOB,
       replaceStr IN varchar2,
       replaceWith IN varchar2 )


   RETURN CLOB
   IS    

     l_buffer VARCHAR2 (32767);
     l_amount BINARY_INTEGER := 32767;
     l_pos INTEGER := 1;
     l_clob_len INTEGER;
	 newClob clob := EMPTY_CLOB;
	  

   BEGIN

    initalize the new clob dbms_lob.CreateTemporary( newClob, TRUE ); 

	 l_clob_len := DBMS_LOB.getlength (srcClob);
     WHILE l_pos < l_clob_len
     LOOP
	 
         DBMS_LOB.READ (srcClob,l_amount,l_pos,l_buffer);
         IF l_buffer IS NOT NULL
         THEN
		   -- replace the text
		   l_buffer := replace(l_buffer,replaceStr,replaceWith);
		   -- write it to the new clob
	       DBMS_LOB.writeAppend(newClob, LENGTH(l_buffer), l_buffer);
         END IF;
         l_pos :=   l_pos + l_amount;
		 
     END LOOP;
	 
	 RETURN newClob;
	 

   EXCEPTION
   WHEN OTHERS THEN
        RAISE;
   END;
 

Neue Beiträge

Zurück