Oracle 11g Express EditionでSJISを利用する

何回かやることがあったのでまとめてみました。

参考サイト:Tec Wiki

コマンドプロンプトは管理者として実行したほうがいいかも。

新規インスタンス用のディレクトリを作成

set SID=[SID名]
set ORACLE_XE_DIR=D:\oraclexe
set ORACLE_HOME=%ORACLE_XE_DIR%\app\oracle\product\11.2.0\server
set PREFIX_DIR=%ORACLE_XE_DIR%\%SID%
mkdir %PREFIX_DIR%\%SID%
mkdir %PREFIX_DIR%\%SID%\conf
mkdir %PREFIX_DIR%\%SID%\dbf
mkdir %PREFIX_DIR%\%SID%\dump
mkdir %PREFIX_DIR%\%SID%\dump\adump
mkdir %PREFIX_DIR%\%SID%\dump\bdump
mkdir %PREFIX_DIR%\%SID%\dump\cdump
mkdir %PREFIX_DIR%\%SID%\dump\udump

pfileを作成

set CONF_FILE=%PREFIX_DIR%\conf\init%SID%.ora
echo db_name='%SID%' > %CONF_FILE%
echo control_files='%PREFIX_DIR%\dbf\control.dbf'   >> %CONF_FILE%
echo audit_file_dest='%PREFIX_DIR%\dump\adump'      >> %CONF_FILE%
echo core_dump_dest='%PREFIX_DIR%\dump\cdump'       >> %CONF_FILE%
echo undo_management='AUTO' >> %CONF_FILE%
echo undo_tablespace='UNDO' >> %CONF_FILE%

サービスの作成

oradim -NEW -SID %SID% -SYSPWD manager -PFILE %CONF_FILE%

インスタンスの起動

set TEMP_FILE=%TEMP%\xe_startup.sql
set ORACLE_SID=%SID%
echo startup nomount pfile=%CONF_FILE% > %TEMP_FILE%
echo exit > %TEMP_FILE%
sqlplus / as sysdba @%TEMP_FILE%
del %TEMP_FILE%

データベースの作成

set TEMP_FILE=%TEMP%\xe_create_db.sql
echo create database %SID%                                    >  %TEMP_FILE%
echo logfile group 1 ('%PREFIX_DIR%\dbf\redo1.dbf') size 32M, >> %TEMP_FILE%
echo         group 2 ('%PREFIX_DIR%\dbf\redo2.dbf') size 32M, >> %TEMP_FILE%
echo         group 3 ('%PREFIX_DIR%\dbf\redo3.dbf') size 32M  >> %TEMP_FILE%
echo character set JA16SJISTILDE                              >> %TEMP_FILE%
echo national character set utf8                              >> %TEMP_FILE%
echo datafile '%PREFIX_DIR%\dbf\system.dbf'                   >> %TEMP_FILE%
echo          size 240M autoextend on                         >> %TEMP_FILE%
echo          next 16M maxsize unlimited                      >> %TEMP_FILE%
echo          extent management local                         >> %TEMP_FILE%
echo sysaux datafile '%PREFIX_DIR%\dbf\sysaux.dbf'            >> %TEMP_FILE%
echo        size 48M autoextend on                            >> %TEMP_FILE%
echo        next 8M maxsize unlimited                         >> %TEMP_FILE%
echo undo tablespace undo                                     >> %TEMP_FILE%
echo      datafile '%PREFIX_DIR%\dbf\undo.dbf'                >> %TEMP_FILE%
echo      size 48M autoextend on                              >> %TEMP_FILE%
echo default temporary tablespace temp                        >> %TEMP_FILE%
echo         tempfile '%PREFIX_DIR%\dbf\temp.dbf'             >> %TEMP_FILE%
echo         size 8M autoextend on;                           >> %TEMP_FILE%
echo exit                                                     >> %TEMP_FILE%
sqlplus / as sysdba @%TEMP_FILE%
del %TEMP_FILE%

必要なスクリプトの実行

set TEMP_FILE=%TEMP%\xe_additional_script1.sql
echo @?\RDBMS\ADMIN\catalog.sql  > %TEMP_FILE%
echo @?\RDBMS\ADMIN\catproc.sql >> %TEMP_FILE%
echo exit                       >> %TEMP_FILE%
sqlplus / as sysdba @%TEMP_FILE%
del %TEMP_FILE%

set TEMP_FILE=%TEMP%\xe_additional_script2.sql
echo @?\sqlplus\admin\pupbld.sql  > %TEMP_FILE%
echo exit                        >> %TEMP_FILE%
sqlplus system/manager as sysdba @%TEMP_FILE%
del %TEMP_FILE%

ユーザ用環境構築

set TEMP_FILE=%TEMP%\xe_create_user_tablespace.sql
echo create tablespace users                      > %TEMP_FILE%
echo        datafile '%PREFIX_DIR%\DBF\user.dbf' >> %TEMP_FILE%
echo        size 300M                            >> %TEMP_FILE%
echo        autoextend on maxsize 1024M          >> %TEMP_FILE%
echo        extent management local              >> %TEMP_FILE%
echo        segment space management auto;       >> %TEMP_FILE%
echo create user dbadmin identified by dbadmin   >> %TEMP_FILE%
echo        default tablespace users             >> %TEMP_FILE%
echo        temporary tablespace temp            >> %TEMP_FILE%
echo        quota unlimited on users;            >> %TEMP_FILE%
echo grant connect, resource, dba to dbadmin;    >> %TEMP_FILE%  
echo exit                                        >> %TEMP_FILE%
sqlplus system/manager as sysdba @%TEMP_FILE%
del %TEMP_FILE%

listener.ora

XEと、新規のインスタンスの2つと接続できるようにリスナーの設定を編集。
※管理者権限じゃないと編集できない。

変更前。

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = plutow)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

変更後。

[]内は自分の環境に変更してください(ORACLE_HOMEとSERVICE_NAME)。

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = XE)
      (ORACLE_HOME = [ORACLE_HOMEのパス])
      (SERVICE_NAME = XE)
    )
    (SID_DESC =
      (SID_NAME = ORCL)
      (ORACLE_HOME = [ORACLE_HOMEのパス])
      (SERVICE_NAME = [新規インスタンス名])
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = plutow)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

データベース開始のバッチの編集

notepadを管理者権限で実行して、以下のファイルを開きます。

※%ORACLE_HOME%は自分で置換してください。

%ORACLE_HOME%\bin\StartDB.bat

変更前。

@echo off
net start OracleXETNSListener 2>nul
net start OracleServiceXE 2>nul
@oradim -startup -sid XE -starttype inst > nul 2>&1

変更後。※%SID%は自分で置換してください。

@echo off
net stop OracleService%SID%
net start OracleXETNSListener 2>nul
net start OracleServiceXE 2>nul
@oradim -startup -sid XE -starttype inst > nul 2>&1

新規インスタンス用のデータベース開始のバッチを作成

新規インスタンス用のデータベース開始用のバッチを以下のファイル名で作成します。

※%ORACLE_HOME%、%SID%は自分で置換してください。

%ORACLE_HOME%\bin\StartDB%SID%.bat

以下の内容を記述します。

@echo off
net stop OracleServiceXE 2>nul
net start OracleXETNSListener 2>nul
net start OracleService%SID%
@oradim -startup -sid %SID% -starttype inst > nul 2>&1

作成したら、ショートカットを以下のフォルダに作成します。

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Oracle Database 11g Express Edition

作成したショートカットのプロパティを以下のように変更します。

  • 名前を「データベースの起動(%SID%)」に変更します。
  • アイコンをStartBD.ico(ファイル名が間違っている)に設定します。
  • リンク先を「データベースの起動」と同じ形式にします。
  • プロパティ画面の[ショートカット]タブの詳細設定」で「管理者として実行」にチェックします。

データベースの停止のバッチの編集

notepadを管理者権限で実行して、以下のファイルを開きます。

※%ORACLE_HOME%は自分で置換してください。

%ORACLE_HOME%\bin\StartDB.bat

変更前。

net stop OracleServiceXE

変更後。※%SID%は自分で置換してください。

net stop OracleServiceXE
net stop OracleService%SID%