Экспорт CLOB в текстовый файл с использованием Oracle SQL Developer
-
07-07-2019 - |
Вопрос
Я использую 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).
Пожалуйста, прокомментируйте, если и как это требует корректировки / более подробной информации.