Экспорт CLOB в текстовый файл с использованием Oracle SQL Developer - PullRequest
13 голосов
/ 16 сентября 2009

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

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

Ответы [ 5 ]

14 голосов
/ 16 сентября 2009

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

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.

2 голосов
/ 26 июля 2015

Вы можете использовать скрипт 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

0 голосов
/ 06 марта 2019

Поскольку в явном виде упоминается Oracle SQL Developer, и поощряются «решения типа хакерского подхода» (и в случае, если кто-то по-прежнему нуждается в…):

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

Работает даже для CLOB, превышающих 4000 символов. Поможет ли это на самом деле, во многом будет зависеть от реального содержания CLOB. Иногда некоторая предварительная обработка SQL может привести вас туда ...

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

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

0 голосов
/ 05 ноября 2009

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

0 голосов
/ 16 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...