8
9

Oracle Databaseのデータをcsv化するpythonスクリプト

Last updated at Posted at 2017-08-18

#目的
Oracle Databaseのディクショナリ情報を、
pythonのライブラリ(cx_Oracle)を使用して
汎用データ取得スクリプトです。

#なぜ?
sqlplusのspoolで取得するのが一般的だと思いのですが
やはり遅いですよね?
毎回、取得データに合わせてスクリプトを書くのは面倒ですよね?
取得したは良いがフォーマットがガタガタで再取得なんて事も多いですよね?

#作成したスクリプト

staticinfo.py
#!/usr/bin/python
import cx_Oracle
import os
import sys
import csv

USER='******'            #環境に合わせて変更してください(system)
PASS='********'          #環境に合わせて変更してください(manager)
HOST='***.***.***.***'   #環境に合わせて変更してください(192.168.0.1)
PORT='****'              #環境に合わせて変更してください(1521)
SERVICE_NAME='****'      #環境に合わせて変更してください(ORCL)
FETCH_ROWS=100           #環境に合わせて変更してください

argv = sys.argv
argc = len(argv)
if argc != 2:
  print('Usage: %s filename or tablename' % argv[0])
  quit()

print("execution..." + argv[1])

p1 = argv[1]
name, ext = os.path.splitext(p1)

if ext == ".sql":
  #SQL文取得
  f = open(p1)
  sql = f.read()
  f.close()

  out_file_name = name + '.csv'
else:
  #SQL文作成
  sql = 'select * from %s' % p1

  out_file_name = p1.replace('$','_') + '.csv'

with cx_Oracle.connect(USER,PASS,HOST+':'+PORT+'/'+SERVICE_NAME) as conn:
  #SQL文実行
  cur_detail = conn.cursor()
  cur_detail.execute(sql)

  #カラム名を取得
  csv_header = [str[0] for str in cur_detail.description]

  #データ部を取得
  f = open(out_file_name, 'w')
  writer = csv.writer(f, lineterminator='\n', quoting=csv.QUOTE_ALL)
  writer.writerow(csv_header)
  while 1:
    csv_detail = cur_detail.fetchmany(FETCH_ROWS)
    if len(csv_detail) == 0:
      break
    writer.writerows(csv_detail)
  cur_detail.close()

#実行方法

$ python staticinfo.py dba_users

・環境変数(ORACLE_HOME/LD_LIBRARY_PATH)等を指定する必要があります。
・カレントディレクトリに(dba_users.csv)という目的のファイルが作成されます。
・事前にスクリプトを用意しておけば、スクリプトの結果をcsvにするとこも可能です。

#面倒なので
下記のようなshellを作成して、一気に出力をします。

staticinfo.sh
#!/bin/sh
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2/client_1
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

python staticinfo.py dba_users
python staticinfo.py dba_profiles
python staticinfo.py dba_data_files
python staticinfo.py dba_temp_files
python staticinfo.py dba_tablespaces
python staticinfo.py dba_segments
python staticinfo.py dba_roles
python staticinfo.py dba_role_privs
python staticinfo.py dba_sys_privs
python staticinfo.py dba_tab_privs
python staticinfo.py gv\$database
python staticinfo.py gv\$instance
python staticinfo.py gv\$log
python staticinfo.py gv\$logfile
python staticinfo.py gv\$controlfile
python staticinfo.py gv\$parameter2

python staticinfo.py 01_tablespace_capacity.sql
python staticinfo.py 02_datafile_capacity.sql
python staticinfo.py 03_tempfile_capacity.sql

#最後に
汎用的にしたかったので、こだわった点は、SQLファイルの実行とカラム名の自動取得です。
もちろんユーザデータの取得する事も可能ですので
カスタマイズ次第で、可能性を秘めているスクリプトになったと思っています。

#追記
「cx_Oracle」から「python-oracledb」に、なったので修正が必要

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9