データベース抽象化レイヤーは、難しいと考えられているデータベースの変更をより簡単に行うことができます。しかし、抽象化レイヤーを使用していても、完全にデータベース間の依存性をなくすることは難しいことです。リスト1を見てみると、OracleとMySQLではストアドプロシージャの呼び出し方が異なることがわかるでしょう。Oracleでのストアドプロシージャの呼び出しはBEGINではじまりますが、MySQLではCALLで実行されます。
リスト1
//MySqlのストアドプロシージャ
$objResult = mysqli_query($link,"CALL SP_GET_LIST()")
while ($arrRow = mysqli_fetch_array($objResult)) {
echo "First: ".$arrRow['FIRST_NAME']." "
"Last: ".$arrRow['LAST_NAME']."<br> ";
}
mysqli_free_result($result);
//Oracleのストアドプロシージャ
$stmt = OCIParse($objDB,"BEGIN SP_GET_LIST(:recordset); END;");
OCIBindByName($stmt,":recordset",$arrRecordset,32);
$objResult = OCIExecute($stmt);
foreach($arrRecordset as $arrRow){
echo "First: ".$arrRow['FIRST_NAME']." "
"Last: ".$arrRow['LAST_NAME']."<br> ";
}
これはデータベース抽象化レイヤーを使用するときの欠点の1つです。もし抽象化レイヤーの目的がコードのポータビリティを保つことであると、プロシージャの呼び出しは当然一般化する必要があります。PDOではANSI SQLに厳格に従っており、プリペア文はすべてのデータベースはこの標準通りに理解するので一般化できますが、ストアドプロシージャの呼び出しはデータベースごとに異なります。
データベース抽象化レイヤーの主な利点は、同様のタスクを実行するためのコードの量を減らし、単純化することにあります。もしPHP 5.1のリリースを待てないのなら、ADOdbが最適な解となるでしょう。ポータビリティを重要視するのであれば、複雑なSQLのクエリを標準化するために相当な時間を使わなければならないことに注意しましょう。
ADOdbでOracleだけの機能を使用する場合や、特定のデータベースに制限された機能があるので、ポータビリティを確保することは簡単ではありませんし、現実的ではないでしょう。
|