web-dev-qa-db-ja.com

OracleSQLDeveloperを使用したCLOBのテキストファイルへのエクスポート

Oracle SQL Developerを使用していて、テーブルをCSVファイルにエクスポートしようとしています。一部のフィールドはCLOBフィールドであり、多くの場合、エクスポートが発生するとエントリは切り捨てられます。私の最終目標はここでOracleを使用しないことであるため、すべてを引き出す方法を探しています(Oracleダンプを受け取りました-これはOracleデータベースにロードされましたが、別の形式でデータを使用しているので、仲介者としてのCSV)。

これに対する複数の解決策がある場合、それが私にとって1回限りの手順であることを考えると、より複雑な「正しく行う」解決策に対する、よりハックっぽいタイプの解決策を気にしません。

13
geoffjentry

データベースボックスのファイルシステムにアクセスできる場合は、次のようにすることができます。

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

コピーして貼り付けたもの このサイトから

これも TL_FILEに関する前の質問 便利です。 CSVへのエクスポートに対応しています。ただし、UTL_FILEがCLOBを処理する方法についてはわかりません。

15
JD Long

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のインストールを支援

2

これは短くて一般的なpythonスクリプトです-これを実行します-テーブル(残りの中でCLOBフィールドを含む)をフラットcsvファイルにダンプします: OraDump

0
ScienceFriction

Oracle SQL Developerが明示的に言及され、「ハックっぽいタイプのソリューション」が推奨されたため(そして、誰かがまだ必要としている場合に備えて…):

(Oracle SQL Developerの)SQLワークシートから単一のステートメントを実行すると、結果が表として表示されます。結果テーブルをクリックした後、キーボードショートカットまたは編集メニューを使用して、最初にテーブル全体にマークを付け、次にその内容をコピーします。選択したテキストエディタに進みます。ペースト。ファイルに保存します。うまくいけば。 ;-)

4000文字を超えるCLOBでも機能します。それが実際に役立つかどうかは、CLOBの実際のコンテンツに大きく依存します。 SQLの前処理によって、そこに到達する場合があります…

または、結果テーブルのローカルメニューを試してくださいエクスポート…。そこからExcel 95-2003形式オプションを使用すると機能する場合があります(CSVまたはテキスト/ TSVよりも優れています)。

調整/詳細が必要な場合はコメントしてください。

0
Abecee

oracleダンプによって、(exportまたはexpdpからの).dmpを意味すると仮定すると、バイナリファイルを見ていることになります。ダンプファイルをOracleデータベースにインポートしてから、UTL_FILEまたはその他の方法を使用してデータをプレーンテキストにエクスポートする必要があります。

0
Neil Kodner