ここでは、PHP から Oracle のストアドプロシージャを呼び出し、その結果を取得するサンプルを掲載しています。ちなみに、ストアドプロシージャは英語では stored procedure と書きます。
スポンサーリンク
ストアドプロシージャの呼び出しと結果の取得
oci8 関数を使ってストアドプロシージャを実行し、OUT パラメータを取得するサンプルコードです。dbms_utility.db_version プロシージャを呼び出してデータベースのバージョンを 取得しています。
// データベースへ接続する $conn = oci_connect('user', 'password', 'dbname'); // データベースのバージョンを取得する // dbms_utility.db_version プロシージャを実行する $sql = <<< SQL_END declare begin dbms_utility.db_version(:version, :compatibility); end; SQL_END; $stmt = oci_parse($conn, $sql); // パラメータを割り当て oci_bind_by_name($stmt, ":version", $version, 128); oci_bind_by_name($stmt, ":compatibility", $compatibility, 128); // sql の実行 oci_execute($stmt, OCI_NO_AUTO_COMMIT); // ステートメントの解放 oci_free_statement($stmt); // データベースから切断 oci_close($conn); // 出力 var_dump($version); var_dump($compatibility); // 出力結果例 // ---------------------------------------------- // string '11.1.0.7.0' (length=10) // string '11.1.0.0.0' (length=10)
ポイント
- php.ini 内の allow_call_time_pass_reference は On にする
allow_call_time_pass_reference=Off の場合、次のようにエラーが発生してしまいます。
Deprecated: Call-time pass-by-reference has been deprecated in ・・・
- oci_bind_by_name の第4パラメータでバッファの大きさを指定する
バッファの大きさを OUT パラメータのサイズより大きく取得しておかないと、次のように Oracle エラーが発生してしまいます。
ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました
ORA-06512: “SYS.DBMS_UTILITY”, 行514 ORA-06512: 行3 in ・・・