Экспорт CLOB в текстовый файл с использованием Oracle SQL Developer

StackOverflow https://stackoverflow.com/questions/1434443

Вопрос

Я использую Oracle SQL Developer и пытаюсь экспортировать таблицу в файл CSV. Некоторые поля являются полями CLOB, и во многих случаях записи обрезаются при экспорте. Я ищу способ получить все это, так как моя конечная цель - не использовать Oracle здесь (я получил дамп Oracle - который был загружен в oracle db, но я использую данные в другом формате, так что через CSV как посредник).

Если есть несколько решений для этого, учитывая, что это однократная процедура для меня, я не возражаю против более хакерских решений для более вовлеченных пользователей "сделай это правильно" решения.

Это было полезно?

Решение

если у вас есть доступ к файловой системе в вашей базе данных, вы можете сделать что-то вроде этого:

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;
/

Которые я скопировал и вставил с этого сайта . р>

Вы также можете найти этот предыдущий вопрос о UTL_FILE полезно. Это касается экспорта в CSV. Однако я не знаю и не знаю, как UTL_FILE обрабатывает CLOB.

Другие советы

Вы можете использовать скрипт Python, чтобы позаботиться об экспорте, CLOB не будут усечены:

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

К вашему сведению: Помогите установить cx_Oracle

предполагая, что под дампом Oracle вы имели в виду .dmp (из экспорта или expdp), вы просматриваете двоичный файл. Вам нужно будет импортировать файл дампа в базу данных Oracle, а затем экспортировать данные в обычный текст, используя UTL_FILE или другими способами.

Вот краткий, но общий сценарий Python, который делает именно это - выдает таблицы (с полями CLOB, среди прочего) в плоский CSV-файл: OraDump

В качестве Oracle SQL Developer явно упоминается и «решения типа hack-ish». были поощрены (и в случае, если кто-то по-прежнему нуждается в & # 8230;):

Если из SQL Worksheet (в Oracle SQL Developer) выполняется один оператор, результат отображается в виде таблицы. Нажав на таблицу результатов, используйте сочетания клавиш или меню Изменить , чтобы сначала отметить всю таблицу, а затем скопировать ее содержимое. Перейдите к вашему текстовому редактору по вашему выбору. Вставить. Сохранить в файл. Надеюсь, сделано. ; -)

Работает даже для объектов CLOB длиной более 4000 символов. Поможет ли это на самом деле, во многом будет зависеть от реального содержания CLOB. Иногда некоторая предварительная обработка SQL может привести вас к этому & # 8230;

Или попробуйте в локальном меню таблицы результатов Экспорт & # 8230; . Оттуда может работать формат Excel 95-2003 (лучше, чем CSV или text / TSV).

Пожалуйста, прокомментируйте, если и как это требует корректировки / более подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top