Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2006/10/31

counter hits
since 1999/11/06


Oracleエラーのハンドリング

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

alertOracle関数(Ora_XXXX関数)は推奨されない関数となっています。PDO関数が使えない・使わない場合は、OCI8関数(現在のOracle関数)を使いましょう。

トランザクション処理の最後に、「エラーが発生していなければCOMMIT 、そうでなければROLLBACK」といった処理を必ずやりますが、ここではPHPでのOracleエラーのハンドリングについてまとめています。

まず、エラーが発生したかどうかの判断ですが、PHPマニュアルにあるOCIError/Ora_Error関数の戻り値で判断できます。しかし、OracleエラーはPHPのparseエラーなどと同様にエラーメッセージがそのまま表示されてしまいますので、これを表示しないようにし独自のエラーメッセージを表示させることになります。

サンプルですが、以下のようなテーブルを対象にしたものを作ってみました。

●テスト用テーブル定義
CREATE TABLE test(
    col1 VARCHAR2(10),
    col2 VARCHAR2(10)
);
  
●error_handling.php

<?php
/**
 * エラーメッセージを表示させる
 *
 * @param $err OCIError()の戻り値(連想配列)
 */
function showDetail($err) {
    echo "<h3>エラーです</h3>";
    echo "エラーコード:" . $err['code'] . '<br>';
    echo "メッセージ:" . $err['message'] . '<br>';
}
?>
<?php
    // エラー表示をOFFにする
    error_reporting(0);

    /**
     * 接続エラーを発生させる例
     *
     * $conn = OCILogon("scott", "tig", "orcl");
     */
    $conn = OCILogon("scott", "tiger", "orcl");
    $err = OCIError();
    if ($err) {
        showDetail($err);
        exit;
    }

    // わざとエラーを発生させる
    $sql  = "INSERT INTO test VALUES ('test','長〜〜〜〜〜〜〜〜い文字列')";
    $stmt = OCIParse($conn, $sql);
    OCIExecute($stmt, OCI_DEFAULT);
    $err = OCIError($stmt);
    if ($err) {
        OCIRollback($conn);
        showDetail($err);
    }

    OCICommit($conn);
    OCILogoff($conn);    // 実際には何もしない
?>

実行結果は、以下のような感じになります。

エラーです

エラーコード:12899
メッセージ:ORA-12899: value too large for column "SCOTT"."TEST"."COL2" (actual: 13, maximum: 10)


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2006 by Hideyuki SHIMOOKA all rights reserved.