Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7">

XCIISESAM データベース関数

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

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

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

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

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

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

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

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

ディレクティブ意味
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フィールドを取得する際に次の型変換が 自動的に適用されます。

表 3SQL から 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 ドキュメント(ドイツ語) を参照下さい。共にオンラインで参照可能です。もしくは、適 当なマニュアルを使用して下さい。

目次
sesam_affected_rows -- ç›´è¿‘のクエリにより作用されたレコードの数を得る
sesam_commit --  SESAMデータベースへの待機中の更新処理をコミットする
sesam_connect -- SESAM データベース接続をオープンする
sesam_diagnostic --  直近のSESAMコールに関するステータス情報を返す
sesam_disconnect -- SESAM接続から切り離す
sesam_errormsg -- ç›´è¿‘のSESAMコールのエラーメッセージを返す
sesam_execimm -- SQL命令を直ちに実行する
sesam_fetch_array -- é€£æƒ³é…åˆ—としてレコードを1件取得
sesam_fetch_result -- ã‚¯ã‚¨ãƒªçµæžœã®å…¨ã¦ã‚るいは一部を返す
sesam_fetch_row -- 1件分のレコードを配列として取得
sesam_field_array --  結果の個々のカラムに関するメタ情報を返す
sesam_field_name --  結果集合のカラム名を返す
sesam_free_result -- ã‚¯ã‚¨ãƒªã«é–¢ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚’開放する
sesam_num_fields -- çµæžœé›†åˆã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰/カラム数を返す
sesam_query -- SESAM SQL クエリを実行し、結果を準備する
sesam_rollback --  SESAMデータベースに対する待機中の更新を破棄する
sesam_seek_row --  連続的に取得する際にスクロール可能なカーソルモードに設定する
sesam_settransaction -- SESAM トランザクションパラメータ