Frage

Ich bin mit Oracle SQL Developer und versuchen, eine Tabelle in eine CSV-Datei zu exportieren. Einige Felder sind CLOB Felder, und in vielen Fällen die Einträge werden abgeschnitten, wenn der Export geschieht. Ich bin nach einem Weg suchen, um die ganze Sache zu bekommen, da mein Endziel Oracle ist hier nicht zu verwenden (erhielt ich ein Oracle-Dump - das in eine Oracle-Datenbank geladen wurde, sondern bin mit den Daten in einem anderes Format, so geht über CSV als Vermittler).

Wenn es mehrere Lösungen für diese sind, da es eine einmalige Prozedur für mich, ich habe nichts dagegen, die mehr hack-ish Art-Lösungen für mehr beteiligt „es richtig machen“ Lösungen.

War es hilfreich?

Lösung

Wenn Sie den Zugriff auf das Dateisystem auf dem Datenbankfeld haben Sie so etwas tun könnte:

CREATE OR REPLACE DIRECTORY documents AS 'C:\';
SET SERVEROUTPUT ON
DECLARE
  l_file    UTL_FILE.FILE_TYPE;
  l_clob    CLOB;
  l_buffer  VARCHAR2(32767);
  l_amount  BINARY_INTEGER := 32767;
  l_pos     INTEGER := 1;
BEGIN
  SELECT col1
  INTO   l_clob
  FROM   tab1
  WHERE  rownum = 1;

  l_file := UTL_FILE.fopen('DOCUMENTS', 'Sample2.txt', 'w', 32767);

  LOOP
    DBMS_LOB.read (l_clob, l_amount, l_pos, l_buffer);
    UTL_FILE.put(l_file, l_buffer);
    l_pos := l_pos + l_amount;
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLERRM);
    UTL_FILE.fclose(l_file);
END;
/

Was ich kopiert und eingefügt von dieser Seite .

Sie können auch diese vorherige Frage zu UTL_FILE finden nützlich. Es richtet den Export in CSV. Ich habe keine Ahnung oder Erfahrung mit, wie UTL_FILE Griffe CLOBs jedoch.

Andere Tipps

Sie können einen Python-Skript verwenden, den Exports zu kümmern, nicht der CLOBs abgeschnitten werden:

from __future__ import print_function
from __future__ import division

import time
import cx_Oracle

def get_cursor():
    '''
    Get a cursor to the database
    '''
    # https://stackoverflow.com/questions/24149138/cx-oracle-doesnt-connect-when-using-sid-instead-of-service-name-on-connection-s
    # http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html
    ip = '' # E.g. '127.0.0.1'
    port = '' # e.g. '3306'
    sid = ''
    dsnStr = cx_Oracle.makedsn(ip, port, sid)
    username = '' # E.g. 'FRANCK'
    password = '' # E.g. '123456'
    db = cx_Oracle.connect(user=username, password=password, dsn=dsnStr)    
    cursor = db.cursor()
    return cursor

def read_sql(filename):
    '''
    Read an SQL file and return it as a string
    '''
    file = open(filename, 'r')
    return ' '.join(file.readlines()).replace(';', '')

def execute_sql_file(filename, cursor, verbose = False, display_query = False):
    '''
    Execute an SQL file and return the results
    '''
    sql = read_sql(filename)
    if display_query: print(sql)
    start = time.time()
    if verbose: print('SQL query started... ', end='')
    cursor.execute(sql)
    if verbose: 
        end = time.time()
        print('SQL query done. (took {0} seconds)'.format(end - start))
    return cursor


def main():
    '''
    This is the main function
    '''
    # Demo:
    cursor = get_cursor()
    sql_filename = 'your_query.sql' # Write your query there
    cursor = execute_sql_file(sql_filename, cursor, True)    
    result_filename = 'result.csv'   # Will export your query result there
    result_file = open(result_filename, 'w')
    delimiter = ','    
    for row in cursor:
        for count, column in enumerate(row):
            if count > 0: result_file.write(delimiter)
            result_file.write(str(column))
        result_file.write('\n')
    result_file.close()


if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

Zur Info: Hilfe Installation cx_Oracle

unter der Annahme von einer Oracle-Dump Sie ein .dmp gemeint (entweder von Export oder expdp), sind Sie in einer Binärdatei suchen. Sie müssen die dumpfile in einer Oracle-Datenbank importieren und dann die Daten in Klartext exportieren UTL_FILE oder andere Mittel verwendet wird.

Hier ist ein kurzer, aber allgemeiner Python-Skript, das dies tut nur - Dumping-Tabellen (mit CLOB Feldern, unter anderem) auf eine flache CSV-Datei: OraDump

Als Oracle SQL Developer ist explizit erwähnt und "hack-ish Art Lösungen" gefördert wurden (und falls jemand noch in Not ...):

Wenn eine einzelne Anweisung aus einem SQL-Arbeitsblatt ausgeführt wird (in Oracle SQL Developer), wird das Ergebnis als Tabelle angezeigt. Nach der Ergebnistabelle klicken, verwenden Sie Tastenkombinationen oder das Bearbeiten Menü zuerst die gesamte Tabelle markiert und dann den Inhalt zu kopieren. Fahren Sie mit Ihrem Texteditor der Wahl. Einfügen. Speichern in einer Datei. Hoffentlich getan. ; -)

Funktioniert auch für CLOBs von mehr als 4000 Zeichen. Unabhängig davon, ob es tatsächlich hilft, hängt sehr stark von der tatsächlichen Inhalt CLOBs. Manchmal einig SQL-Vorverarbeitung könnte man dort ...

versuchen Alternativ in der lokalen Menü der Ergebnistabelle Exportieren ... . Wenn man von dort aus durch die Excel 95-2003 Formatoption könnte funktionieren (besser als CSV oder Text / TSV).

Bitte äußern, ob und wie diese Anpassung / weiteres Detail erfordert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top