Oracle SQL Developerを使用したCLOBのテキストファイルへのエクスポート
-
07-07-2019 - |
質問
Oracle SQL Developerを使用していて、テーブルをCSVファイルにエクスポートしようとしています。一部のフィールドはCLOBフィールドであり、多くの場合、エクスポートが発生するとエントリが切り捨てられます。私の最終目標はここでOracleを使用しないことです(OracleデータベースにロードされたOracleダンプを受け取りましたが、別の形式のデータを使用しているので、全体を取り出す方法を探しています媒介としての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
.dmpを意味するOracleダンプ(exportまたはexpdpのいずれか)を想定して、バイナリファイルを見ています。ダンプファイルをOracleデータベースにインポートしてから、UTL_FILEまたは他の手段を使用してデータをプレーンテキストにエクスポートする必要があります。
これを実行する短いまだ一般的なpythonスクリプトを次に示します-テーブル(他のCLOBフィールドを含む)をフラットなcsvファイルにダンプする: OraDump
Oracle SQL Developerが明示的に言及されており、「ハック型のソリューション」奨励されました(そして誰かがまだ必要としている場合…):
単一の文がSQLワークシート(Oracle SQL Developer内)から実行される場合、結果は表として表示されます。 結果テーブルをクリックした後、キーボードショートカットまたは[編集]メニューを使用して、最初にテーブル全体をマークしてから、そのコンテンツをコピーします。 選択したテキストエディタに進みます。ペースト。ファイルに保存します。うまくいけば。 ;-)
4000文字を超えるCLOBでも機能します。実際に役立つかどうかは、CLOBの実際のコンテンツに大きく依存します。場合によっては、SQLの前処理によってそこに到達することがあります…
結果テーブルのローカルメニューで[エクスポート… ]を試してください。そこから Excel 95-2003 形式オプションを使用すると、動作する可能性があります(CSVまたはtext / TSVよりも優れています)。
調整/詳細が必要な場合はコメントしてください。