[PHP-users 11485] OCIBindByNameでストアドの戻り値が正しく取れない

j_kawakita php-users@php.gr.jp
Thu, 14 Nov 2002 13:37:53 +0900


はじめまして、かわきたと申します。

php4.0.6+apahce1.3.26+mod_ssl-2.8.10-1.3.26、
oracle8.1.7の動作環境で、
oci関数を使って問い合わせをしています。

ocibindbynameを用いて、プロシージャの引数を取得し
取得した値によって結果判定を行なっているのですが、
帰ってきた結果が正しく判定できないことがあります。

帰ってきた結果を表示してみると「0」が表示されるのに
switch文に入るとcase 0: に引っかからずdefault まですっとんでいきます。

結果を入れている変数の型はstring型になっていました。
ストアドプロシージャ側ではnumber型なのになぜ変わっているのでしょうか?

また、(int)を用いて結果を入れている変数をキャストしたところ、
正しく判定されていない時には値が、"0" → 2 へ変わってしまいます。

同じような事象に遭遇されている方がいましたら、
対処方法を教えて下さい。
プログラムによるものか、
環境によるものなのか切り分けもできていない状況です。

どうぞよろしくお願いします。


補足)ソースです。
////////////////////////////////////////////////////////////
$strSql = "DECLARE BEGIN ";
$strSql .= "S_TEST_PRO(:I_01,:I_02,:I_03,:I_04,:IO_05); ";
$strSql .= "END;";

unset($o_num_Ret);
$o_num_Ret = 0;

if (pfParseSql($strSql, $intStmt) > 0) {
    @OCIBindByName($intStmt,":I_01",&$i_str_arg1, -1);
    @OCIBindByName($intStmt,":I_02",&$i_str_arg2, -1);
    @OCIBindByName($intStmt,":I_03",&$i_str_arg3, -1);
    @OCIBindByName($intStmt,":I_04",&$i_str_arg4, -1);
    @OCIBindByName($intStmt,":IO_05",&$o_num_Ret,8);

    if (@OCIExecute($intStmt, OCI_DEFAULT)){

        switch ($o_num_Ret) {
            case 2: // NG
                return 1;
                break;
            case 1: // OK
                break;
            case 0: // OK
                break;
            case -1: // システムエラー
                return -1;
                break;
            case -2: // DBロックエラー
                return -2;
                break;
            default:
                return -3;
                break;
        }
    } else {
        return -4;
    }
    @OCIFreeStatement($intStmt);
}
////////////////////////////////////////////////////////////
プロシージャはこんな感じです。

PROCEDURE S_TEST_PRO(
i_str_Arg1 IN VARCHAR2,
i_str_Arg2 IN VARCHAR2,
i_str_Arg3 IN VARCHAR2,
i_str_Arg4 IN VARCHAR2,
o_num_Ret OUT NUMBER
);
////////////////////////////////////////////////////////////