SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

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

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

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

ダウンロード サンプルコード (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パラメータになります。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
MySQLでのストアドプロシージャの呼び出し

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4575 2009/12/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング