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

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

# 導入

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

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

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

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

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

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

> 注意: SESAMへのアクセスは、CVS 版の PHP 3 でのみ可能です。 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 関数を 使用する際に必要です。

例:

    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 識別子と同じキーワード

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

- データ型の表示長

  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 | float
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