6.1 DBD::Symfowareの制限
DBD::Symfowareの制限について説明します。
自動コミットの動作
自動コミットにおいて、検索中に他のSQL文を実行すると、検索を続けるこ とができなくなります。また、複数の検索を行っているときに、ある1つの検 索が終了すると他の検索を続けることができなくなります。
検索中に他のSQL文を実行するときや複数の検索を行う場合は、自動コミッ トを使用しないでください。
文字列長の制限
文字列型において、取り出すときの長さが32000バイトを超えるものは検索 できません。データベース内部文字コードの長さより取り出すときの文字コー ドの長さが延びる場合は、32000を超えることがありますので注意が必要です。
動的パラメタの制限
動的パラメタの精度と位取りは、対応する列の精度と位取りを採用します。
値式の制限
値式にROW̲ID(行識別子)を指定することはできません。
列名の取得の制限
NAMEを用いて選択リストの列名を取得したとき、列名は必ずOSの文字コード 系となります。
子プロセスへのハンドル継承不可
forkを用いて子プロセスを生成し、その子プロセスにハンドルを継承し、子 プロセスでハンドルを用いてデータベースアクセスすることはできません。
6.2 RDBコマンドの呼び出しの制限
6.2 RDBコマンドの呼び出しの制限
RDBコマンドの呼び出しの制限について説明します。
DBD::SymfowareによるデータベースアクセスとRDBコマンドの呼び出 しの混在不可
PerlスクリプトからRDBコマンドを呼び出したとき、Perlインタプリタのプ ロセスからRDBコマンドのプロセスが生成されます。
PerlスクリプトからDBD::Symfowareを用いたSymfoware/RDBへのアクセス中 にRDBコマンドを呼び出した場合、PerlスクリプトのプロセスとRDBコマンドの プロセスの間で排他が発生し、排他エラーや排他待ちが発生する可能性があり ます。排他の詳細は、 RDB ユーザーズガイド データベース定義編 の 応用 プログラムおよびRDBコマンド間の排他 を参照してください。
よって、PerlスクリプトからDBD::Symfowareを用いたSymfoware/RDBへのア クセス中にRDBコマンドを呼び出さないでください。
停止しないRDBコマンドの呼び出し不可
rdblkinfコマンドに‑dオプションを指定した場合、rdblkinfコマンドは強制 停止が行われるまで実行中となります。
Perlスクリプトから実行中のコマンドを強制停止する方法はありません。
よって、Perlスクリプトから停止しないRDBコマンドを呼び出さないように してください。
RDBコマンドに対して標準入力を送り込むときの制限
Windowsにおいて、 5.2.2 open2を用いたRDBコマンドの呼び出し で、RDB コマンドに対して標準入力を送り込んだときに、正しく動作しないことがあり ます
また、ApacheのPerlモジュール mod̲perl において、RDBコマンドに対し て標準入力を送り込んだときに正しく動作しません。
6.3 マルチバイト文字列の注意
マルチバイト文字列の注意について説明します。
6.3.1 マルチバイト文字列の問題
マルチバイト文字列の問題について説明します。
マルチバイト文字列の問題とは
Perlには、Perlスクリプト中の文字にEUC(Extended UNIX Code)、シフトJIS コードが含まれているときの考慮が足りません。そのためいくつかの問題が起 こることが分かっています。
正規表現の問題
文字列が"A"から"Z"の範囲であることを判定する場合に"A‑Z"という正規表 現を用います。一方、文字列が"あ"から"ん"の範囲であることを判定する場合 に"あ‑ん"という正規表現を用いても、期待する結果になりません。
文字列長、部分文字列の問題
処理の内容によっては、文字"あ"を一文字と換算したいことがありますが、、 文字列の長さはバイト数です。よって、"あいうえお"の長さは10バイトであり、
マルチバイト文字列"あいうえお"から二文字目を取り出すと、"い"ではなく"
あ"の後方1バイトの文字となります。
シフトJIS文字列の0x5cの問題
シフトJIS文字列中に16進数で0x5c(¥)の文字を含む場合、Perlの構文エラ ーとなります。これを避けるためには、EUCコードのPerlスクリプトに書き直 す、または0x5cの前に0x5cを指定する必要があります。
0x5cの前に0x5cを指定する例を以下に示します。
use DBI ;
$dbh = DBI‑>connect( "dbi:Symfoware:RDBDB", "rdbmng", "******", { PrintError =>
0 } ) or die "$DBI::errstr¥n" ;
$dbh‑>do( "DROP TABLE STOCKS.在庫表¥ CASCADE" ) ;
$dbh‑>do( "CREATE TABLE STOCKS.在庫表¥ ( 製品番号 INTEGER NOT NULL, 製品名 CHAR(20) NOT NULL, 在庫数量 INTEGER, 倉庫番号 SMALLINT NOT NULL ) ON DBSP1" ) or die "$DBI::errstr¥n" ;
$dbh‑>do( "INSERT INTO STOCKS.在庫表¥ VALUES( 140, '演奏装置', 120, 2 )" ) or die "$DBI::errstr¥n" ;
$dbh‑>do( "INSERT INTO STOCKS.在庫表¥ VALUES( 110, '表¥示装置', 85, 2 )" ) or die "$DBI::errstr¥n" ;
$sth = $dbh‑>prepare( "SELECT * FROM STOCKS.在庫表¥" ) or die "$DBI::errstr¥n" ; printf "Statement : %s¥n", $sth‑>{Statement} ;
$sth‑>execute ;
while( @array = $sth‑>fetchrow̲array ) { printf "@array¥n" ;
}
die "$DBI::errstr¥n" if $DBI::err ;
6.3 マルチバイト文字列の注意
$dbh‑>disconnect or die "$DBI::errstr¥n" ;
DBIでのマルチバイト文字の扱い
DBI::neatにおいて、マルチバイト文字を印字不可能な文字と判断しピリオ ド(.)に置換することがあります。dump̲resultやDBI::neat̲listは、DBI::neat を用いるため、dump̲result、DBI::neat̲list、DBI::neatを用いてフェッチし たデータを表示するとマルチバイト文字は正しく表示されないことがありま す。dbishはdump̲resultを用いてフェッチしたデータを表示するため、マルチ バイト文字は正しく表示されないことがあります。
DBI::neat、DBI::neat̲listにおいて、指定するデータ長はバイト数です。
データ中にマルチバイト文字列を含む場合において、指定するデータ長がマル チバイト文字の途中のバイトまでのとき、マルチバイト文字の途中のバイトで データが切り捨てられます(いわゆるマルチバイト文字の泣き別れが生じま す)。
NAME̲lc、NAME̲ucにおいて、列名の大文字を小文字または小文字を大文字に 置換します。列名がマルチバイト文字のとき、バイト中の大文字と小文字を置 換してしまうことがあります。