PHP マニュアル
前のページ |  | 次のページ

# XCVI. SESAM データベース関数

# 導入

SESAM/SQL-Server は、ドイツの Fujitsu Siemens コンピュータにより開 発されたメインフレーム上のデータベースシステムです。このデータベー スは、ハイエンドのメインフレーム上でオペレーティングシステム BS2000/OSD を使用して動作します。

数多くのBS2000システムにて実運用され、SESAM/SQL-Server は以下の事 項を実証しています。

- Java、Web ベースのクライアント/サーバ接続が簡単に可能

- 99.99% 以上の確率で有効に動作する能力

- 数万から数十万のユーザを管理する能力

PHPスクリプトによるデータベース処理を可能にする PHP3 SESAM インター フェースが利用可能です。

> 注意: SESAMへのアクセスは、CVS版の`PHP3`でのみ可能で す。`PHP 4`は、SESAMデータベースをサポートしま せん。

# 実行用の設定

これらの関数の動作は、`php.ini`の設定により変化します。

`sesam_oml` string

  ロード可能なSESAMドライバモジュールを含むBS2000 PLAM ライブラ リの名前。SESAM関数を使用する際に必要。BS2000 PLAMライブラリは、 ACCESS=READ,SHARE=YES に設定する必要があります。これは、Apache サーバのユーザIDにより読み込み可能とする必要があるためです。

`sesam_configfile` string

  SESAMアプリケーション設定ファイルの名前。SESAM関数を使用する際 に必要。BS2000 ファイルは、ApacheのユーザIDにより読み込み可と する必要があります。

  アプリケーション設定ファイルは、通常、次のような設定を有してい ます。(SESAMリファレンスを参照)

      CNF=B
      NAM=K
      NOTYPE

`sesam_messagecatalog` string

  SESAMメッセージカタログファイルの名前。多くの場合、このディレ クティブは不要です。SESAMメッセージファイルがシステムのBS2000 メッセージファイルテーブルにインストールされていない場合にのみ このディレクティブを設定することが可能です。

  メッセージカタログは、ACCESS=READ,SHARE=YES に設定する必要があ ります。これは、Apache サーバのユーザIDから読み込み可能とする 必要があります。

# 設定上の注意

PHP SESAMインタフェースは、スタンドアロン版をサポートしていません。 Apache モジュール版として組み込まれた場合のみ動作します。Apache PHP モジュールにおいて、SESAMイン タフェース は、Apache 用ディレクティブにより設定されます。

表 1. SESAM 設定用ディレクティブ

ディレクティブ | 意味
--- | ---

`php3_sesam_oml`

ロード可能なSESAMドライバモジュールが含まれるBS2000 PLAM ラ イブラリの名前。SESAM関数を使用するために必要。

例:

    php3_sesam_oml $.SYSLNK.SESAM-SQL.030

`php3_sesam_configfile`

SESAM SESAMアプリケーション設定ファイルの名前。SESAM関数を使用する 際に必要。

例:

    php3_sesam_configfile $SESAM.SESAM.CONF.AW

通常、次のような設定が含まれます。(SESAMリファレンスマニュ アルを参照)

    CNF=B
    NAM=K
    NOTYPE

`php3_sesam_messagecatalog`

SESAMメッセージカタログファイルの名前。多くの場合、このディ レクティブは不要です。SESAMメッセージファイルがシステム BS2000メッセージファイルてーぶりにインストールされていない場 合にのみ、このディレクティブを設定することが可能です。

例:

    php3_sesam_messagecatalog $.SYSMES.SESAM-SQL.030

PHP/SESAMインターフェースの設定に加えて、メインフレーム上のSESAM データベースサーバー自体を設定する必要があります。これは、次のよ うになります。

- SESAMデータベースハンドラ(DBH)を開始

- SESAMデータベースハンドラを指定して、データベースに接続

PHPスクリプトとデータベースハンドラの間の接続を得るには、選択した SESAM設定ファイルのパラメータ `CNF` および `NAM` が実行中のデータベースハンドラのIDに一致し ている必要があります。

分散型データベースの場合、ホストおよびデータベース名を有する分配 テーブルを指定してSESAM/SQL-DCNエージェントを開始する必要がありま す。

(POSIXサブシステムで実行されている)PHPと(POSIXサブシステムの外で 実行されている)データベースハンドラの間の通信は、SQLSCIという名前 の特別なドライバモジュールと通常メモリを使用するSESAM接続モジュー ルで実現されます。通常メモリアクセスのため、そして、PHPはWebサー バの静的部分であるため、ODBC、JDBC、UTM経由のリモートアクセスは不 要であり、データベースへのアクセスは非常に高速です。

スモールスタブローダ(SESMOD)のみがPHPにリンクされており、SESAM接 続モジュールはSESAMのOML PLAMライブラリからロードされます。 設定の際、このPLAMライブラ リの名前とSESAM設定ファイルを使用するためのファイルリンクをPHPに 指定する必要があります。(SESAM V3.0 において、SQLSCI は標準配布の SESAMツールライブラリから入手可能です)

SQLコマンドにおけるシングルクオートのクオートは、(シングルクオー トの前にバックスラッシュを付加するのではなく、)シングルクオートを 2つ重ねて使用するため、SESAMインターフェースを使用する全てのPHPス クリプトについて、PHP設定ディレクティブで `php3_magic_quotes_gpc` および `php3_magic_quotes_sybase` を `On` にしておく方が賢明でしょう。

# 実行時の考慮

BS2000 モデルの制限のために、ドライバは、Apache サーバがそのサー バの子プロセスをフォークした後にのみロード可能となります。これは、 各子プロセスの最初のSESAMリクエストを若干遅くしますが、その後のア クセスへの応答は最高速度となります。

SESAM用の明示的にメッセージカタログを定義した場合、そのカタログは ドライバがロードされる度(すなわち、最初のSESAMリクエスト時に)にロー ドされます。BS2000 オペレーティングシステムはメッセージカタログの ロードに成功した後にメッセージを出力します。このメッセージは、 Apacheのerror_logファイルに送信されます。BS2000は現在、このメッセー ジの出力を停止することができません。このため、ログを段々と埋めて いきます。

SESAM OML PLAM ライブラリとSESAM設定ファイルは、Webサーバを実行し ているユーザIDから読み込み可能であることを確認して下さい。そうで ない場合、サーバはドライバをロードすることができず、SESAM関数をコー ルすることができません。また、Apacheサーバを実行しているユーザID にデータベースへのアクセスが許可されている必要があります。そうで ない場合、SESAMデータベースハンドラへの接続は失敗します。

# カーソル型

SQL "select 型"クエリ用に確保された結果カーソルは、"sequential"ま たは"scrollable"のどちらかとすることが可能です。"scrollable"カー ソルで必要なメモリオーバヘッドはより大きいため、デフォルトは "sequential" です。

"scrollable"カーソルを使用した場合、カーソルは結果集合の中で自由 に移動可能です。各"scrollable"クエリについて、スクロール型のグロー バルなデフォルト値(`SESAM_SEEK_NEXT`に初期化され ます)があり、スクロールオフセットは、 sesam_seek_row() により一回設定されるか、 sesam_fetch_row() によりレコードを取得する度に 設定されるかのどちらかです。"scrollable"カーソルを使用してレコー ドを取得する際に、スクロール型およびスクロールオフセットのグロー バルデフォルト値について次のようなポスト処理行われます。

表 2. スクロール後のカーソルに関するポスト処理

スクロール型 | 動作
--- | ---
`SESAM_SEEK_NEXT` | なし
`SESAM_SEEK_PRIOR` | なし
`SESAM_SEEK_FIRST` | スクロール型を `SESAM_SEEK_NEXT` に設定
`SESAM_SEEK_LAST` | スクロール型を `SESAM_SEEK_PRIOR` に設定
`SESAM_SEEK_ABSOLUTE` | 内部オフセット値を自動的に増加させる
`SESAM_SEEK_RELATIVE` | なし。(グローバルデフォルト値 `offset` を保持する。これにより、例えば、10個前のレコードを取得すると いったことが可能になります)

# 移植上の注意

PHPでは、配列の添字は(1よりも)0から始まるのが普通なため、いくつか の調整がSESAMインターフェースで行われています。ある添字配列がネー ティブのSESAMインターフェースで添字1から始まる際には、PHPインター フェースでは最初の添字として0を使用します。例えば、 sesam_fetch_row() でカラムを取得する際に、最初 のカラムの添字は0であり、その後のカラム番号はカラム数 ($array["count"])に達するまで(カラム数は含まず)増えていきます。 SESAMアプリケーションを他の高級言語からPHPに移植する際には、この インターフェース上の変更に留意する必要があります。各PHP sesam 関 数の説明の適切な場所に添字が0から始まるという注意が含まれています。

# セキュリティの考慮

SESAMデータベースへのアクセスが可能な場合、Webサーバのユーザは、 可能な限り小さな権限のみを有している必要があります。多くのデータ ベースでは許可する必要があるのは読み込み権限のみです。使用する設 定に応じて状況に見合ったアクセス権限を追加して下さい。決してネッ トからの全てのユーザに全てのデータベースへの完全な制御権を許可し ないで下さい! データベースを管理するPHPスクリプトへのアクセス制限 は、パスワード制限またはSSLセキュリティにより制限して下さい。

# 他のSQLデータベースからの移行

SQLには方言があるため100%互換ではありません。他のデータベースイン ターフェースからSQLアプリケーションをSESAMに移植する際には、いく つかの修正が必要になる可能性があります。次のような典型的な差異に 注意する必要があります。

- ベンダ固有のデータ型

  いくつかのベンダ固有のデータ型は、標準的なSQLデータ型で置換す る必要があります。(例えば、`TEXT` は `VARCHAR(max. size)`で置換可能です。)

- SQL IDと同じキーワード

  SESAM では(通常のSQLと同様に)このようなIDは2重引用付で括る(も しくは名前を変える)必要があります。

- データ型の表示長

  SESAM データ型は表示長ではなく、ある精度を有しています。 `int(4)`(意図された使用法:'9999'までの整数)の 代わりに、SESAM は単に31ビット長の`int`を要求 します。また、SESAMで利用可能な日付時刻型は次のものだけです。 `DATE`、 `TIME(3)`、 `TIMESTAMP(3)`

- ベンダ固有のSQL型 `unsigned`、 `zerofill`、`auto_increment` 属性

  `unsigned` と `zerofill` は サポートされません。`auto_increment` は自動で す。(SESAMに実装された自動インクリメントの利点を活かすために、 `"... VALUES(0,...)"` の代わりに `"INSERT ... VALUES(*, ...)"` を使用して下さ い。)

- int ... DEFAULT '0000'

  数値変数は、文字列定数で初期化するべきではありません。代わりに DEFAULT 0 を使用して下さい。SQLデータ型 datetime の変数を初期化する際、初期化文字列には、次のように適 当な型キーワードを前に付加する必要があります。 `CREATE TABLE exmpl ( xtime timestamp(3) DEFAULT TIMESTAMP '1970-01-01 00:00:00.000' NOT `NULL` );`

- $count = xxxx_num_rows();

  いくつかのデータベースは、返される値が著しく不正確であるとして も、クエリ結果のレコード数を推定または見積もろうとします。 SESAM はクエリ結果のレコード数を実際に取得する前に知ることはあ りません。その数が実際に必要な場合には、 SELECT COUNT(...) WHERE ... を試してみて下 さい。このクエリは、ヒット数を取得します。2番目のクエリは(理想 的には)結果を返します。

- DROP TABLE thename;

  SESAMでは、DROP TABLE においてテーブル名の 後にキーワード `RESTRICT` または `CASCADE` のどちらかを後に付加する必要があり ます。`RESTRICT` を指定した場合、(VIEWのよう な)依存するオブジェクトがある場合にエラーが返されます。また、 `CASCADE` を指定した場合、依存するオブジェク トは指定したテーブルから削除されます。

# 様々なSQL型を使用する場合の注意

SESAM は現在BLOB型をサポートしていません。SESAMの将来のバージョン は、BLOBをサポートする予定です。

PHP インターフェースでは、SQLフィールドを取得する際に次の型変換が 自動的に適用されます。

表 3. SQL から PHP への型変換

SQL 型 | PHP 型
--- | ---
SMALLINT, INTEGER | "integer"
NUMERIC, DECIMAL, FLOAT, REAL, DOUBLE | "double"
DATE, TIME, TIMESTAMP | "string"
VARCHAR, CHARACTER | "string"

レコード全体を取得する際、結果は配列として返されます。空のフィー ルドには値が入っていないため、個々のフィールド自体の存在を調べる 必要があります(空のフィールドかどうか調べるには、 isset() または empty() を使 用して下さい) 。この手法は、(空のフィールドの表現として型の文字列 を使用するよりも)空のフィールドの見え方をユーザが制御することが可 能となります。

# SESAM の "複数フィールド" 機能のサポート

SESAM特有の"複数フィールド"機能により複数のフィールドの配列からな るカラムを使用することが可能です。"複数フィールド"カラム亜は、次 のように作成可能です。

例 1. "複数フィールド"カラムを作成する

    CREATE TABLE multi_field_test (
        pkey CHAR(20) PRIMARY KEY,
        multi(3) CHAR(12)
    )

上のレコードに次のように代入することができます。

例 2. "複数フィールド"カラムに代入する

    INSERT INTO multi_field_test (pkey, multi(2..3) )
        VALUES ('Second', <'first_val', 'second_val'>)

(この場合のように)先頭の空のサブフィールドは無視され、代入された 値は詰められることに注意して下さい。このため、上記の例の結果は、 multi(2..3) ではなく、multi(1..2) となります。

結果レコードを取得する際、"複数カラム"は"インラインの"付加カラム のようにアクセスされます。上のにおいて、"pkey" は添字0を有し、3つ の"multi(1..3)" カラムは添字1から3でアクセス可能です。

# 以下も参照下さい:

SESAM固有の事項について詳細は、the SESAM/SQL-Serverドキュメント(英語) または SESAM/SQL-Server ドキュメント(ドイツ語) を参照下さい。共にオンラインで参照可能です。もしくは、適 当なマニュアルを使用して下さい。

前のページ | ホーム | 次のページ
shm_remove | 上に戻る | sesam_affected_rows