初期化パラメータの一覧(11.2)

11g Release 2(11.2) のものをGoogle先生をつかって見つけられなかったのでHTMLマニュアルから抽出してみた。設計という名の下全部の初期化パラメータの説明を羅列するという苦行があったりするんだよね。一つ一つの値についてチェックしました、というエビデンスみたいなものか?

  • 11.2のHTMLマニュアルだとパラメータごとにファイルが分かれていて一覧としてはいまいち見にくい事に気がついた。
  • Excelに取り込むってことならCSV化よりTSV化のほうが楽だと思った。
  • 説明は最初の1文だけ(最初のpタグ分だけ)
  • 簡易説明(英語)でよければ v$parameter2 をExcelに貼付けるのが楽。
  • Python でHTML解析をするには BeautifulSoup なるものを使える。
  • Python で日本語使おうとすると儀式が必要だった(http://python.blog-slime.com/2007/08/utf8.html)。
  • 検索ちゃんとしたらもっとしっかりした一覧がでてきてへこみそう。
  • 会社でやりたかったのだが、手元にVM入れられずLinux環境が無いので自宅で。Linux上じゃないとこういうことをする気力が起こらない。

結果

ファイル自体を貼ると問題がありそうなので結果イメージ。


抽出用スクリプト extract.py (Python)

# -*- coding: utf-8 -*-

#
# <前提>
#
# UTF-8を使えるようにする儀式 (http://python.blog-slime.com/2007/08/utf8.html)
# site-packages/sitecustomize.py を以下の内容で作成する
#
#   import sys
#   sys.setdefaultencoding('utf-8')
#
# BeautifulSoup入手
# http://www.crummy.com/software/BeautifulSoup/
#
# Oracle Database 11g R2 リファレンス
# http://docs.oracle.com/cd/E16338_01/server.112/b56311.zip
#
# <使い方>
#
# (1)b56311.zip を解凍してできる initparamsXXX.htm と同じフォルダに extract.py を配置
# (2)python extract.py > initparams.tsv.utf8.txt
# (3)できたファイルをEXCELの外部ファイル読み込みで取り込む(タブ区切り)
#    必要に応じて文字コードを変えてから取り込む
#

from BeautifulSoup import BeautifulSoup
import re
import os
import sys
import codecs


PFILE    = u'ファイル名'
PNAME    = u'パラメータ名'
PTYPE    = u'パラメータ・タイプ'
PSYNTAX  = u'構文'
PRANGE   = u'値の範囲'
PDEFAULT = u'デフォルト値'
PALTER   = u'変更の可/不可'
PBASIC   = u'基本/基本以外'
PRAC     = u'Oracle RAC'
PDESC    = u'説明'
PEXAM    = u'例'
KEYS     = [PFILE,PNAME,PTYPE,PSYNTAX,PRANGE,PDEFAULT,PALTER,PBASIC,PRAC,PDESC,PEXAM]

NULL_STRING = '<null>'


def sanitize4tsv( s ):
    # 先頭・末尾の改行・空白を削除
    s = s.strip()
    # 連続改行削除
    s = re.sub(r'\n+','\n',s)
    # 改行を ' /// ' に置き換え
    s = s.replace('\n', ' /// ')
    # タブ置換
    s = s.replace('\t','    ')
    return s

def text( node ):
    return ''.join(node.findAll(text=True))

def makeDict( tds ):
    # [[0, 1],[2, 3],...,[n, n+1]] の辞書化(<tr><td>キー</td><td>値</td></tr>想定)
    return dict(zip(map(text,tds[0::2]),map(text,tds[1::2])))

def makeBeautifulSoup( file ):
    htmlfile = codecs.open(file,'r','utf_8')
    html = []
    for line in htmlfile:
        html.append(line)
    htmlfile.close()
    return BeautifulSoup(''.join(html),convertEntities=BeautifulSoup.HTML_ENTITIES)


def extractInitParam( file ):
    dict = {}
    
    # HTML解釈
    soup = makeBeautifulSoup(file)
    dict[PFILE] = os.path.basename(file)

    # パラメータ名取得
    name = soup.html.head.title.string
    dict[PNAME] = name

    # class="inftblinformal" 文字列を含むコメントを位置取得の手がかりにする.
    # 同コメントが存在しない場合はパラメータとして妥当でないと判断する.
    comment = soup.find(text=re.compile('class="inftblinformal"'))
    if comment != None:
        # 最初に現れる tbody がパラメータの属性を示す表
        tds = soup.find('tbody').findAll('td')
        dict.update(makeDict(tds))

        # 先にヒットさせたコメントの後ろの p がパラメータの説明.
        # p に class 指定がある場合は説明ではない場合があるので class 指定が無い p にする.
        p = comment.findNextSibling(lambda t: t.name == 'p' and not t.has_key('class'))
        desc = text(p)
        dict[PDESC] = desc

        print '\t'.join(map(lambda k: sanitize4tsv(dict.get(k,NULL_STRING)), KEYS))


# とりあえずヘッダ出力
print '\t'.join(KEYS)

# initparamsXXX.htm を解析
root = '.'
for curr, dirs, files in os.walk(root):
    for name in sorted(files):
        if name.startswith('initparams'):
            extractInitParam(os.path.join(curr,name))