Oracle Net Services

目次

Oracleの接続方法について説明します。

Oracle9iクライアントの基本構成
Oracle9iとPHP4
Net Servicesに関係するエラーと解決方法
戻る

Oracle9iクライアントの基本構成

Oracleデータアクセスにはいくつかの種類があります。今回は下記の2種類を紹介します。

SQL*Plus
Oracle Call Interface (OCI)

Oracleデータベースサイドではリスナーと
いわれるデーモンが立ち上がっていなければネットワーク接続できません。下の図を参考にしてください。全てのデータアクセスはリスナーを経由していることが解ります。

リスナーは次の様にして立ち上げます。リスナーに関してはメインページよりOracle9iの導入を参照してください。

> lsntcl start LISTENER

<SQL*Plus>
SQL*PlusはOracleとデータのやり取りを行うものです。SQL文を編集してNet Servicesに対して送受信します。具体的には実行するたびに問い合わせの条件となる値を変えたい場合や、実行時によって取り出す列名やソート処理に使いたい列名が変わる場合に有効な「置換変数」や問い合わせ結果にタイトルをつけるといった機能があります。UNIXシェルからSQL*Plusを使う場合は次のコマンドラインを実行してください。

> sqlplus user/password@[OracleSID.domain]

<Oracle Call Interface (OCI)>
作成中

Oracle9iとPHP

PHP4のOCI8を使ってOracle9iに接続する方法を紹介します。尚、Apacheを再度コンパイルする必要があります。

<Apacheの再インストール>
まずダウンロードしたPHPとApacheを展開してください。
DSOに対応したApacheのインストールは次の様に行います。

> tar zxvf apache_1.3.27.tar.gz
> cd apache_1.3.27
> LIBS=-lpthread ./configure --enable-shared=max --enable-module=so
> make
> su
# make install

コンフィグオプション説明
LIBS=-lpthread OCIのエラー回避をするためのオプションです。
--enable-shared=max すべてのライブラリを追加。
--enable-module=so  DSOを有効にする。

<OCI対応PHP4のインストール>
先ほど、DSO形式でApacheをインストールしたので、モジュールのインストールはapxsを利用します。

> tar zxvf php-4.3.1.tar.gz
> cd php-4.3.1
> ./configure --with-apxs=/usr/local/apache/bin/apxs --with-oci8=/oracle/product/ --with-oracle=/oracle/product/ --enable-sigchild --enable-mbstring --enable-mbstr-enc-trans --enable-mbregex --enable-zend-multibyte --without-mysql
> make
> su
# make install

確認のため、/usr/local/apache/libexecにlibphp4.soがあるか確認してください。これがApacheのモジュールです。
Apacheのhttpd.confファイルを編集します。/usr/local/apache/confの中にあります。今回はhttpd.confの内容は次の2行を追記および、編集しました。以前の設定がある場合はそれに追記して下さい。

ServerName sansokan
AddType application/x-httpd-php .php

コンフィグオプション説明
--with-apxs=/usr/local/apache/bin/apxs APXSを使ってlibphp4.soを生成する。
--with-oci8=/oracle/product/ OCI関数を有効にする。
--with-oracle=/oracle/product/ Oracle関数を有効にする。
--enable-sigchild defunctを防止する。
--enable-mbstring マルチバイト文字列関数
--enable-mbstr-enc-trans ファイルアップロードの文字化けを防ぐ
--enable-mbregex マルチバイト正規表現関数
--enable-zend-multibyte PHP国際化を有効にする。
--without-mysql mysqlを無効にする。

<ApacheとPHP4の設定>
起動スクリプトは以下の様になります。これはApacheの親プロセス所有者の環境変数をセットするという意味です。子プロセス所有者の環境変数ではないことに注意してください。ファイルは/etc/rc.d/init.d/の中に作ります。

#!/bin/sh
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORACLE_SID=ckoku
export NLS_LANG=Japanese_Japan.JA16SJIS
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
/usr/local/apache/bin/apachectl start

記述したら、これをランレベル5に合わせて、起動させます。Oracleと連携するので、文字コードを合わせるためにphp.ini-recommendedからコピーしたphp.iniに次の行を追加させます。

i18n.internal_encoding = JAPANESE_JAPAN.JA16SJIS
output_handler = mb_output_handler (119行目)
display_errors = On (282行目)
mbstring.language = Japanese (1014行目)
mbstring.internal_encoding = EUC-JP (1019行目)
mbstring.http_input = auto (1022行目)
mbstring.http_output = SJIS (1026行目)
mbstring.encoding_translation =On (1033行目)
mbstring.detect_order = auto (1037行目)
mbstring.substitute_character = none (1041行目)
mbstring.func_overload = 0 (1051行目)

PHPスクリプトのエンコーディングにShift JISを使う可能性がある場合は、さらにphp.iniに以下の行を追加します。

mbstring.script_encoding = auto

「PHPスクリプトの文字コード = mbstring.internal_encodingの文字コード = NLS_LANGの文字コード」 を指定して下さい。PHPスクリプトとDBから取得した文字での文字化けを防ぐことができます。

以下にPHPとApacheのインストールで注意するべき点をまとめました。
・PHPの設定ファイルでOracleと同じ日本語文字コードを指定してください。
・PHPの設定ファイル php.ini-recommendedはコンパイルしたディレクトリにあります。
 /usr/local/lib/php.ini としてコピーして下さい。
・今回PHP4がOracle9iにアクセスする時は、SJISとなります。従って、環境変数は下記の通りとなります。
 OracleユーザーのNVL_LANG:NLS_LANG=Japanese_Japan.JA16SEUC
 Apacheの親プロセスを実行するユーザーのNVL_LANG:NLS_LANG=Japanese_Japan.JA16SJIS

Net Servicesに関係するエラーと解決方法

<ORA-12154>
リスナーは接続記述子にあるSERVICE_NAMEを解決できませんでした。
原因:tnsnames.oraファイルの中のSERVICE_NAMEが、リスナーで認識しているサービス名と一致していないことが考えられます。
処置:
・環境変数ORACLE_SIDを確認して下さい

・tnsnames.oraファイルが存在し、アクセス可能であることを確認してください。
・tnsnames.oraファイルがTNS_ADMIN環境変数で指定された場所にあることを確認してください。
・tnsnames.oraファイル内で指定されたSERVICE_NAMEが正しいか、構文エラーがないか確認してください。
・sqlnet.oraファイルに重複コピーがないことを確認してください。
・ログインダイアログボックスから接続している場合は、接続サービス名の前に@記号を使っていないことを確認してください。
・2つ以上のデータベースを構築した場合は、グローバル名を付加してください。

<ORA-12541>
リスナーがありません。
原因:リモートノード上のリスナーを見つけられないことが考えられます。
処置:
・リスナーが起動されていることを確認してください。
・リスナーが起動しているかは、リスナー制御ユーティリティのSTATUSコマンドで確認してください。

<ORA-12533>
ADDRESSパラメータが無効です。
原因:tnsnames.oraファイルの中で指定されたADDRESSパラメータのプロトコル固有属性が正しくない。
処置:
・正しいADDRESSパラメータの属性を使用してください。属性のつづりがあっていなかったりするとエラーが発生します。
・有効なADDRESSパラメータの形式は、使用しているプラットフォームのオペレーティングシステムに固有のOracleマニュアルを参照します。

< ORA-12198>
TNS:could not find path to destination
原因:クライアントがデータベースを見つけられないことが考えられます。
処置:
・tnsnames.oraファイルがTNS_ADMIN環境変数で指定された場所にあることを確認してください。
・リスナーノード上のリスナーが起動されていることを確認してください。
・tnsnames.oraファイル内で指定されたSERVICE_NAMEが正しいか、構文エラーがないか確認してください。

 


<戻る>