mysql c ストアド プロシージャ

PHPz
リリース: 2023-05-14 13:24:07
オリジナル
1009 人が閲覧しました

MySQL は、非常に一般的に使用されるリレーショナル データベース管理システムであり、大量のデータを保存、処理、管理するために使用できます。ストアド プロシージャは MySQL が提供する非常に便利な機能で、一連の SQL ステートメントを再利用可能なコード ブロックにカプセル化することで、SQL ステートメントの実行効率の向上、コードの複雑さの軽減、セキュリティの向上などを実現します。したがって、MySQL ストアド プロシージャの使い方をマスターすることは、データベースの開発と管理の効率を向上させる上で非常に重要です。

1. ストアド プロシージャの概要

ストアド プロシージャは、MySQL で定義されたプリコンパイルされた SQL ステートメントのコレクションです。これらはデータベース サーバーでコンパイルされます。クエリを実行するときは、ストアド プロシージャを呼び出すだけで済みます。 . . SQL ステートメントを単独で実行する場合と比較して、ストアド プロシージャを使用すると、ネットワーク オーバーヘッドが大幅に削減され、データ クエリと処理の効率が向上します。

さらに、ストアド プロシージャには次の重要な機能があります。

  1. セキュリティ: データベースに対するユーザーのアクセス権とデータ アクセス方法は、ストアド プロシージャを通じて制御できます。
  2. ロジック: ストアド プロシージャは、計算、ループ、判断などの複雑なデータ操作を完了できます。
  3. 保守性: ストアド プロシージャを使用すると、コードの再利用が増加し、コードの量が削減されるため、データベースの保守と更新が容易になります。

2. ストアド プロシージャの構文形式

MySQL でストアド プロシージャを定義するには、CREATE PROCEDURE ステートメントを使用する必要があります。 CREATE PROCEDURE ステートメントの基本的な構文形式は次のとおりです。

CREATE PROCEDURE 存储过程名称(参数列表) BEGIN -- sql语句 END;
ログイン後にコピー

このうち、ストアド プロシージャ名は必須であり、パラメータ リストは必要に応じて省略できます。 BEGIN と END の間で、一連の SQL ステートメントを記述して、データのクエリ、書き込み、変更、およびその他の関連操作を実行できます。

次はストアド プロシージャの簡単な例です。ストアド プロシージャにはパラメータが 1 つだけあり、それを変更した後に単にそれを返します:

CREATE PROCEDURE test_proc(IN num INT) BEGIN SET num = num + 1; SELECT num; END;
ログイン後にコピー

ストアド プロシージャを実行するとき、ストアド プロシージャは次の方法で呼び出すことができます。 CALL ステートメント:

CALL test_proc(10);
ログイン後にコピー

実行結果は 11 です。

3. ストアド プロシージャのパラメータ

ストアド プロシージャでは、IN、OUT、INOUT の 3 種類のパラメータを使用できます。

  1. IN パラメータ: ストアド プロシージャで渡されるパラメータ値を表し、ストアド プロシージャ内で読み取りおよび変更できます。
  2. OUT パラメータ: ストアド プロシージャ内のパラメータ値出力を表し、1 つ以上の結果を返すことができます。
  3. INOUT パラメータ: ストアド プロシージャの入力パラメータ値と出力パラメータ値を示します。つまり、入力パラメータまたは出力パラメータとして使用できます。

パラメータを含むストアド プロシージャの例を次に示します。

CREATE PROCEDURE get_user_by_id(IN userid INT, OUT username VARCHAR(50)) BEGIN SELECT username FROM user WHERE id=userid; SET username = CONCAT('Welcome, ', username); END;
ログイン後にコピー

このストアド プロシージャを呼び出すときは、userid パラメータを渡し、ユーザー名を受け取る変数を定義する必要があります。出力パラメータ:

DECLARE uname VARCHAR(50); CALL get_user_by_id(1, @uname); SELECT @uname;
ログイン後にコピー

4. ストアド プロシージャのフロー制御とループ

ストアド プロシージャは、SQL ステートメントを直接実行するだけでなく、フロー制御ステートメントとループ ステートメントを使用して特定の論理操作を完了することもできます。 MySQL は、次のフロー制御ステートメントをサポートしています:

  1. IF、ELSEIF、および ELSE: 条件付き分岐の実装に使用されます。
  2. CASE、WHEN、ELSE: 複数の条件分岐を実装するために使用されます。
  3. LOOP および END LOOP: 単純なループを実装するために使用されます。
  4. WHILE DO と END WHILE: 複雑なループを実装するために使用されます。

次は WHILE DO ループの例です。このストアド プロシージャは、ユーザー テーブルの年齢に 1 年を追加します:

CREATE PROCEDURE update_user_age() BEGIN DECLARE i INT DEFAULT 0; DECLARE n INT; SELECT COUNT(*) FROM user INTO n; WHILE i<=n DO UPDATE user SET age=age+1 WHERE id=i; SET i=i+1; END WHILE; END;
ログイン後にコピー

このストアド プロシージャを実行するときに必要なのは、

CALL update_user_age();
ログイン後にコピー

5. ストアド プロシージャでの例外処理

ストアド プロシージャでエラーが発生した場合、例外処理を使用してプログラムのクラッシュを回避できます。 MySQL では、例外処理は DECLARE ... HANDLER 構文を使用して実装されます。

次は例外処理の例です。ユーザー テーブル レコードを削除するときに、レコードが他のテーブルによって参照されている場合、ストアド プロシージャは例外をスローします。

CREATE PROCEDURE delete_user(IN userid INT) BEGIN DECLARE exit_test CONDITION FOR SQLSTATE '23000'; START TRANSACTION; DELETE FROM user WHERE id=userid; IF ROW_COUNT() = 0 THEN SIGNAL exit_test; END IF; COMMIT; END;
ログイン後にコピー

ストアド プロシージャの実行時に例外が発生した場合、それを処理する次のプログラム コードを作成できます:

DECLARE EXIT HANDLER FOR SQLSTATE '23000' -- 处理异常 END;
ログイン後にコピー

6. ストアド プロシージャの最適化

ただしストアド プロシージャ SQL クエリの効率を向上させることができますが、ストアド プロシージャの設計が不合理である場合、クエリ効率の低下につながる可能性もあります。ストアド プロシージャの最適化に関する提案を以下に示します。

  1. ストアド プロシージャの実行効率が大幅に低下するため、一時変数やループ ステートメントを多量に使用しないでください。
  2. フロー制御ステートメントを使用する場合は、SELECT の代わりに RETURN を使用する必要があります。
  3. ストアド プロシージャで Prepared Statement ステートメントを使用してデータのクエリと更新を行うと、クエリの効率が向上します。
  4. ストアド プロシージャの代わりにビューまたは結合クエリの使用を検討してください。

つまり、ストアド プロシージャは MySQL の非常に重要な機能であり、SQL ステートメントの実行効率を向上させ、コードの複雑さを軽減し、セキュリティを向上させることができます。ストアド プロシージャを使用する場合は、パラメータ、プロセス制御、例外処理などに注意する必要があります。また、ストアド プロシージャを最適化してデータベースのクエリと更新の効率を向上させる方法を考慮する必要もあります。

以上がmysql c ストアド プロシージャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!