2017-05-15 4 views
0

Ich möchte alle Daten in CLOB in Zeichenfolge konvertieren. DBMC_LOB.SUBSTR bietet eine Möglichkeit, 4000 Zeichen gleichzeitig abzurufen. Ich bin von MS SQL Hintergrund und nicht von Oracle-Abfragen. Kann mir jemand bei der Syntax helfen.Oracle Schleife durch CLOB, um Zeichenfolge zu erhalten

ich eine Funktion machen wollen und tun so etwas wie

// Get the length of CLOB 
// totalIterationsRequired = length/4000; 
// LOOP around the CLOB and fetch 4000 char at once 
For i in 1..totalIterationsRequired 
LOOP 
// Insert the substring into a varchar2 
// DBMC_LOB.SUBSTR(xml_value,4000*i,(4000*(i-1)+1) 
END LOOP 
// The function will return the varchar2 
+0

Bitte stellen Sie Ihre Frage. Vielen Dank. – anonyXmous

+0

Ich brauche Hilfe bei der Syntax. Aktualisiert die Frage – Ankit

Antwort

2
create table save_table(rec varchar2(4000)); 

create or replace PROCEDURE save_clob (p_clob IN CLOB) 
AS 
    l_length    INTEGER; 
    l_start    INTEGER := 1; 
    l_recsize CONSTANT INTEGER := 4000; 
BEGIN 
    l_length := DBMS_LOB.getlength (p_clob); 

    WHILE l_start <= l_length 
    LOOP 
     INSERT INTO save_table (rec) 
      VALUES (DBMS_LOB.SUBSTR (p_clob, l_recsize, l_start)); 

     l_start := l_start + l_recsize; 
    END LOOP; 
END save_clob; 
+0

Ich denke, es würde einen Fehler auf save_table geben. Und wo fügen wir die Zeichenkette hinzu, um cob zu speichern, die zurückgegeben wird? – Ankit

+1

Dieser Code funktioniert, er wurde aus einem vorhandenen Paket extrahiert. In diesem Beispiel speichern wir die Ergebnisse in einer Tabelle namens 'SAVE_TABLE'. Sie würden dann die Ergebnisse aus der Tabelle auswählen. Es ist keine Funktion. Eine PL/SQL-Funktion kann nur 32767 Zeichen zurückgeben, eine SQL-Funktion 4000 (die Datenbank kann standardmäßig auf einen größeren Wert konfiguriert werden). Der Grund für die Verwendung eines CLOBs besteht darin, dass der Inhalt nicht in eine Zeichenfolge passt. Was würden Sie tun, wenn die CLOB-Größe zu groß ist? –

+0

Sie sind korrekt, aber das kompiliert nicht. Ich denke, dass etwas in der Syntax falsch ist – Ankit

0

Im Folgenden finden Sie die Funktionsdefinition

create or replace function getclobastable (id IN VARCHAR2) 
    return clob_table 
is 
    l_length    INTEGER; 
    l_start    INTEGER := 1; 
    l_recsize CONSTANT INTEGER := 4000; 
    i_clob     CLOB; 
    n BINARY_INTEGER := 0; 
    save_table clob_table := clob_table(); 
BEGIN 

    save_table := clob_table(); 
    -- Get the CLOB data into i_clob 
    l_length := DBMS_LOB.getlength (i_clob); 

    WHILE l_start <= l_length 
    LOOP 
     n := n + 1; 

     save_table.EXTEND(); 
     save_table(n) := DBMS_LOB.SUBSTR (i_clob, l_recsize, l_start); 

     l_start := l_start + l_recsize; 
    END LOOP; 
    RETURN save_table; 
END; 
Verwandte Themen