SELECT DISTINCT CLOB_COLUMN AUS DER TABELLE;
Ich würde gerne finden verschiedene CLOB-Werte kann davon ausgehen, dass die Spalte " CLOB_COLUMN (vom Typ CLOB), die in der Tabelle genannten COPIA.
Ich ausgewählt habe, einen PROZESSUALEN WEG, um dieses problem zu lösen, aber ich würde es vorziehen, zu geben, WÄHLEN Sie einfach wie folgt: SELECT DISTINCT CLOB_COLUMN AUS der TABELLE die Vermeidung der Fehler "ORA-00932: inkonsistente Datentypen: erwartet - bekam CLOB"
Wie kann ich das erreichen?
Vielen Dank im Voraus für Ihre Mitarbeit. Dies ist der prozessuale Weg, habe ich mir gedacht:
-- Find the distinct CLOB values that can assume the column called CLOB_COLUMN (of type CLOB)
-- contained in the table called COPIA
-- Before the execution of the following PL/SQL script, the CLOB values (including duplicates)
-- are contained in the source table, called S1
-- At the end of the excecution of the PL/SQL script, the distinct values of the column called CLOB_COLUMN
-- can be find in the target table called S2
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE S1 DROP STORAGE';
EXECUTE IMMEDIATE 'DROP TABLE S1 CASCADE CONSTRAINTS PURGE';
EXCEPTION
WHEN OTHERS
THEN
BEGIN
NULL;
END;
END;
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE S2 DROP STORAGE';
EXECUTE IMMEDIATE 'DROP TABLE S2 CASCADE CONSTRAINTS PURGE';
EXCEPTION
WHEN OTHERS
THEN
BEGIN
NULL;
END;
END;
CREATE GLOBAL TEMPORARY TABLE S1
ON COMMIT PRESERVE ROWS
AS
SELECT CLOB_COLUMN FROM COPIA;
CREATE GLOBAL TEMPORARY TABLE S2
ON COMMIT PRESERVE ROWS
AS
SELECT *
FROM S1
WHERE 3 = 9;
BEGIN
DECLARE
CONTEGGIO NUMBER;
CURSOR C1
IS
SELECT CLOB_COLUMN FROM S1;
C1_REC C1%ROWTYPE;
BEGIN
FOR C1_REC IN C1
LOOP
-- How many records, in S2 table, are equal to c1_rec.clob_column?
SELECT COUNT (*)
INTO CONTEGGIO
FROM S2 BETA
WHERE DBMS_LOB.
COMPARE (BETA.CLOB_COLUMN,
C1_REC.CLOB_COLUMN) = 0;
-- If it does not exist, in S2, a record equal to c1_rec.clob_column,
-- insert c1_rec.clob_column in the table called S2
IF CONTEGGIO = 0
THEN
BEGIN
INSERT INTO S2
VALUES (C1_REC.CLOB_COLUMN);
COMMIT;
END;
END IF;
END LOOP;
END;
END;
InformationsquelleAutor der Frage UltraCommit | 2010-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diesen Ansatz verwenden. In Tabelle Profil Spalte Inhalt ist NCLOB. Ich fügte hinzu, die where-Klausel, um die Zeit verringern, die benötigt wird, um die hohe,
Ist es nicht darum zu gewinnen, Gewinne für die Effizienz, aber sollte funktionieren.
InformationsquelleAutor der Antwort Janek Bogucki
Vergleicht die hashes der CLOB, um festzustellen, ob Sie Verschieden sind:
Edit:
Den
HASH
Funktion nicht garantieren, dass es keine Kollision. Durch das design allerdings ist es wirklich unwahrscheinlich, dass Sie eine Kollision. Dennoch, wenn das kollisionsrisiko (<2^80?) ist nicht akzeptabel, Sie könnten Verbesserung die Abfrage durch den Vergleich (mitdbms_lob.compare
) die Teilmenge von Zeilen, die die gleichen hashes.InformationsquelleAutor der Antwort Vincent Malgrat
Wenn es akzeptabel ist, abzuschneiden, Ihren Bereich zu 32767 Zeichen das funktioniert:
InformationsquelleAutor der Antwort Laurent
select distinct DBMS_LOB.substr(column_name, 3000) from table_name;
InformationsquelleAutor der Antwort Nitin Pawar
Wenn er die clob, um die Größe einer varchar2 wird nicht funktionieren, und Sie sind besorgt über hash-Kollisionen können Sie:
Beispiel:
InformationsquelleAutor der Antwort Chris Saxon
Umgehen der oracle-Fehler, den Sie haben, so etwas zu tun :
WÄHLEN Sie CLOB_COLUMN AUS der TABELLE COPIA C1
WO C1.ID IN (SELECT DISTINCT C2.ID VON COPIA C2, WO ....)
InformationsquelleAutor der Antwort Salim Hamidi