CodeZine(コードジン)

特集ページ一覧

WindowsでPHPからストアドプロシージャ/ストアドファンクションを実行する

コードの単純化と高速化を実現

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/12/07 14:00

ダウンロード サンプルコード (2.7 KB)

 PHPから3つのデータベースエクステンション(MySQL、MySQLi、PDO)を使ってMySQLのストアドプロシージャまたはストアドファンクションを呼び出す方法について考察します。

目次

はじめに

 MySQL 5.0の新機能にストアドプロシージャとストアドファンクションというものがあります。ストアドプロシージャとは、1つ以上のSQLステートメントを1つの手続きとしてまとめ上げ、それをデータベースサーバに格納したものです。

 本稿では、基本的なストアドプロシージャとストアドファンクションの作り方を示したうえで、PHPからデータベースエクステンションを利用してMySQLのストアドプロシージャとストアドファンクションを呼び出す方法を説明します。

ストアドプロシージャを使うメリット

 ストアドプロシージャには、パフォーマンスを高める効果があります。理由は、事前にコンパイルでき、しかもクライアントからサーバに名前と必要なパラメータだけを送信すれば実行でき、コードを丸ごと送信しなくて済むからです。そのほか次のメリットがあります。

  • 簡単に使える1つの単位として処理をまとめ上げることで複雑な操作を単純化できる
  • 十分に検証されたストアドプロシージャを再利用することで、エラーの発生を抑えることができる
  • 実行方法が言語や環境に依存しない。データベースサーバの側に置かれるので、呼び出すアプリケーション環境が違ってもストアドプロシージャそのものは変化しない
  • データへのアクセスを制限することでデータ破壊のリスクを減らせる
  • ネットワークトラフィックを削減できる。複雑なタスクを反復的に実行する場合は、データを取得して何らかのロジックを適用し、その結果に基づいて別のデータを取得するといったことが必要になるが、こうした複数ステップの処理がデータベースサーバ上で完結するため、クライアントとデータベースサーバの間で結果セットや新たなクエリを往復させなくて済む

MySQLでのストアドプロシージャの作成

 MySQL 5.0になって、ようやくストアドプロシージャの機能が導入されました。この実装では、個々のストアドプロシージャまたはストアドファンクションが特定のデータベースに関連付けられます。そのため次のような性質があります。

  • ストアドプロシージャ(またはストアドファンクション)を呼び出すと、データベースで自動的にUSE db_nameコマンドが実行され、ストアドプロシージャの終了までその効果が持続する
  • 特定のデータベースで作成できるストアドプロシージャの名前は、そのデータベース内で一意的に決まるものでなければならない。例えば、bookデータベースに関連付けられたストアドプロシージャprocまたはストアドファンクションfuncを呼び出すには、CALL book.proc()またはCALL book.func()と書く
  • データベースを削除すると、そのデータベースに関連付けられたストアドプロシージャやストアドファンクションもすべて削除される

 プロシージャまたはファンクションの定義は次の2ステップで行われます。

  1. プロシージャまたはファンクションの名前を定義し、そのパラメータを設定する
  2. プロシージャまたはファンクションの本体をステートメントBEGINENDの間に定義する

 基本的な構文は次のとおりです。

CREATE PROCEDURE procedure_name ([procedure_parameter[,...]])
    routine_body

 procedure_parameterは、パラメータと方向を示す次の引数から成るリストです。

  • IN:値をプロシージャに渡す。その値をプロシージャは変更できるが、プロシージャから復帰したとき、呼び出し元には変更は見えない
  • OUT:値をプロシージャから呼び出し元に戻す。プロシージャ内のパラメータの初期値はNULL。通常、プロシージャはこの値を変更し、プロシージャから復帰したとき呼び出し元には最終的な値が見える
  • INOUT:このINOUTパラメータを初期化するのは呼び出し元だが、プロシージャも値を変更でき、プロシージャから復帰したとき呼び出し元には最終的な値が見える
※著者注

 INOUT、またはINOUTパラメータは、プロシージャでのみ使用できます。ファンクションのパラメータは常にINパラメータになります。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

著者プロフィール

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

  • Octavia Andreea Anghel(Octavia Andreea Anghel)

    経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5