ここでは、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 ・・・