ホームページ > データベース > mysql チュートリアル > mysql ストアド プロシージャはどのような用途に使用されますか?

mysql ストアド プロシージャはどのような用途に使用されますか?

青灯夜游
リリース: 2023-04-04 15:43:07
オリジナル
2693 人が閲覧しました

mysql ストアド プロシージャの役割: 1. 使いやすい単位で処理をカプセル化することで複雑な操作を簡素化する; 2. 変更の管理を簡素化する; 3. アプリケーションのパフォーマンスの向上に役立つ; 4、アプリケーション間のトラフィックの削減に役立つアプリケーションとデータベースサーバー、アプリケーションは複数の長い SQL ステートメントを送信する必要がなく、ストアド プロシージャの名前とパラメーターのみを送信する必要があるため、5. SQL ステートメントの機能と柔軟性を強化でき、mysql が複雑な処理を完了できるようになります。判断やより複雑な操作; 6. データベースのセキュリティとデータの完全性などを向上させることができます。

mysql ストアド プロシージャはどのような用途に使用されますか?

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

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

ストアド プロシージャは、特定の関数を完了するように設計された一連の SQL ステートメントです。ストアド プロシージャを使用する目的は、SQL ステートメントで一般的または複雑な作業を事前に作成し、指定した名前で保存することです。このプロシージャはコンパイルおよび最適化されてデータベース サーバーに保存されるため、ストアド プロシージャと呼ばれます。将来、定義したストアド プロシージャと同じサービスをデータベースで提供する必要がある場合は、「CALL ストアド プロシージャ名」を呼び出すだけで自動的に完了します。

データベースの操作に一般的に使用される SQL ステートメントは、最初にコンパイルし、実行時に実行する必要があります。ストアド プロシージャは、別のアプローチで SQL ステートメントを実行します。

ストアド プロシージャは、データベースに作成および保存されるプログラム可能な関数であり、通常は SQL ステートメントといくつかの特別な制御構造で構成されます。ストアド プロシージャは、異なるアプリケーションまたはプラットフォームで同じ特定の機能を実行する場合に特に適しています。

MySQL 5.0 バージョンは以前はストアド プロシージャをサポートしていなかったので、MySQL のアプリケーションが大幅に減少しました。 MySQL はバージョン 5.0 からストアド プロシージャをサポートしているため、データベースの処理速度が向上するだけでなく、データベース プログラミングの柔軟性も向上します。

ストアド プロシージャはデータベースの重要な機能です。ストアド プロシージャデータの変換、データの移行、レポートの作成はプログラミング言語に似ており、正常に実行されると、いつでも呼び出して、指定された機能操作を完了できます。

ストアド プロシージャを使用すると、データベース アクセスの効率が向上するだけでなく、データベース使用のセキュリティも向上します。

呼び出し元にとって、ストアド プロシージャは SQL ステートメントをカプセル化するため、呼び出し元は論理関数の特定の実装プロセスを考慮する必要がありません。簡単な呼び出しだけで、JavaやC#などのプログラミング言語から呼び出すことができます。

ストアド プロシージャの役割 (利点)

  • 処理を使いやすい単位でカプセル化することで複雑さを簡素化する操作;

  • 変更管理を簡素化します。テーブル名、カラム名、ビジネスロジックが変更された場合。変更する必要があるのはストアド プロシージャのコードのみであり、ストアド プロシージャを使用する人は自分のコードを変更する必要はありません。

  • 通常、ストアド プロシージャはアプリケーションのパフォーマンスの向上に役立ちます。作成されたストアド プロシージャはコンパイルされるとデータベースに保存されます。ただし、MySQL はストアド プロシージャの実装方法が若干異なります。 MySQL ストアド プロシージャはオンデマンドでコンパイルされます。ストアド プロシージャをコンパイルした後、MySQL はそれをキャッシュに配置します。 MySQL は、接続ごとにストアド プロシージャの独自のキャッシュを維持します。アプリケーションが 1 つの接続でストアド プロシージャを複数回使用する場合は、コンパイルされたバージョンを使用します。それ以外の場合、ストアド プロシージャはクエリのように機能します。

  • ストアド プロシージャは、アプリケーションとデータベースのサーバー間のトラフィックの削減に役立ちます。 、アプリケーションは複数の長い SQL ステートメントを送信する必要がなく、ストアド プロシージャの名前とパラメーターのみを送信する必要があるため、

  • # SQL ステートメントの機能と柔軟性を強化できます

  • ストアド プロシージャは、フロー制御ステートメントを使用して作成できます。これは、強力な柔軟性を備え、複雑な判断やより複雑な操作を完了できます。

  • データベースのセキュリティとデータの整合性の向上
  • ストアド プロシージャのセキュリティを向上させる 1 つの方法は、ストアド プロシージャを中間コンポーネントとして使用することです。プロシージャ、特定のテーブルに対して関連する操作を実行し、ストアド プロシージャを外部プログラムへのインターフェイスとして提供します。これにより、外部プログラムはデータベースのテーブルを直接操作することができず、ストアドプロシージャを通じてのみ対応するテーブルを操作できるため、セキュリティをある程度向上させることができます。

  • データを独立させる
  • データを独立させると分離の効果が得られます。つまり、プログラムは複数の SQL ステートメントを実行する代わりにストアド プロシージャを呼び出すことができます。この場合、ストアド プロシージャによってデータがユーザーから分離されます。利点は、データ テーブルの構造が変更された場合に、テーブルを呼び出すときにプログラムを変更する必要がないことです。データベース管理者はストアド プロシージャを書き直すだけで済みます。 。

ストアド プロシージャの欠点

    多数のストアド プロシージャを使用する場合、これらのストアを使用すると、プロセスの接続ごとのメモリ使用量が大幅に増加します。さらに、ストアド プロシージャで多数の論理操作を過剰に使用すると、CPU 使用率も増加します。これは、MySQL データベースの元の設計は効率的なクエリに重点を置いていて、論理操作には向いていなかったためです。
  • ストアド プロシージャの構築により、複雑なビジネス ロジックを使用したスト​​アド プロシージャの開発がより困難になります。

  • ストアド プロシージャのデバッグが困難になります。ストアド プロシージャをデバッグできるデータベース管理システムはわずかです。残念ながら、MySQL にはストアド プロシージャをデバッグする機能がありません。

  • ストアド プロシージャの開発と保守は簡単ではありません。ストアド プロシージャの開発と保守には、多くの場合、すべてのアプリケーション開発者が備えているわけではない特殊なスキル セットが必要です。これにより、アプリケーションの開発およびメンテナンスの段階で問題が発生する可能性があります。

#MySQL のストアド プロシージャ

プロシージャの作成と呼び出し

##ストアド プロシージャを作成します。コードは次のとおりです。
-- 创建存储过程 
create procedure mypro(in a int,in b int,out sum int) 
begin 
set sum = a+b; 
end;
ログイン後にコピー

実行結果は次のとおりです。

「関数」でプロセスを表示することもできます。図に示すように、Navicat クライアントのノードにアクセスします。 mysql ストアド プロシージャはどのような用途に使用されますか?

#ストアド プロシージャを呼び出します。コードは次のとおりです。 mysql ストアド プロシージャはどのような用途に使用されますか?

call mypro(1,2,@s);-- 调用存储过程 
select @s;-- 显示过程输出结果
ログイン後にコピー
実行結果

mysql ストアド プロシージャはどのような用途に使用されますか?

##ストアド プロシージャの構文分析

プロシージャの作成

作成に使用しますプロシージャ;
  • mypro はプロセス名を定義するために使用されます;
  • (in a int, in b int, out sum int) は、プロセスのパラメータ。
  • in
  • は入力パラメータを表し、out は出力パラメータを表します。 Java でメソッドを定義するときの仮パラメータと戻り値と同様に、begin
  • end
  • はプロセス本体の開始と終了を表し、 Java 定義メソッドのペア 中括弧; call はプロセスの呼び出しに使用され、
  • @s
  • はプロセスの出力パラメーターを受け取るために使用される変数
ストアド プロシージャのパラメータ

MySQL ストアド プロシージャのパラメータは、ストアド プロシージャの定義で使用されます。パラメータ タイプは 3 つあります。 :

IN
入力パラメータ: 呼び出し元がプロセスに値を渡すことを示します (受信値はリテラルまたは変数にすることができます);
  • OUT 出力パラメータ: プロセスを示します 呼び出し元に値を渡します (複数の値を返すことができます) (送信される値は変数のみです);
  • INOUT入力パラメータと出力パラメータ: これは、呼び出し元がプロセスに値を渡すことを意味します。また、プロセスが呼び出し元に値を渡すことも意味します (値は変数のみにすることができます)。
  • ストアド プロシージャはパラメータに応じて 4 つのカテゴリに分類できます:
  • 1). パラメータのないプロシージャ;

2). 入力パラメータのみのあるプロシージャ;

3). 出力パラメータのみを持つプロシージャ;

4). 入力パラメータと出力パラメータを含むプロシージャ。

変数

MySQL のストアド プロシージャは、Java のメソッドに似ています。 この場合、変数はストアド プロシージャでも使用できます。 Java のローカル変数のスコープは変数が配置されているメソッドですが、MySQL のローカル変数のスコープは変数が配置されているストアド プロシージャです。

#変数定義

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
ログイン後にコピー
##declare は変数を宣言するために使用されます。

  • variable_name は変数名を表し、

  • datatype は MySQL のデータ型を表します。

  • default

    は、デフォルト値を宣言するために使用されます。

    ##例:
declare name varchar(20) default ‘jack’。
ログイン後にコピー
  • 変数の割り当て
  • SET 变量名 = 表达式值 [,variable_name = expression ...]
    ログイン後にコピー
    ストアド プロシージャで変数を使用します。コードは次のとおりです
  • use schooldb;-- 使用 schooldb 数据库
    -- 创建过程
    create procedure mypro1()
    begin
    declare name varchar(20);
    set name = '丘处机';
    select * from studentinfo where studentname = name;
    end;
    -- 调用过程
    call mypro1();
    ログイン後にコピー
    実行結果

    #フロー制御ステートメント

    if 条件ステートメントmysql ストアド プロシージャはどのような用途に使用されますか?

    IFステートメントに複数の条件判定が含まれている場合、TRUE

    FALSE

    、および if

    else if

    、## の結果に基づいてステートメントを実行します。プログラミング言語の #else 構文は似ています。 ストアド プロシージャを定義し、整数を入力し、if ステートメントを使用してそれが正の数か負の数かを判断します。コードは次のとおりです:

    -- 创建过程
    create procedure mypro2(in num int)
    begin
    if num<code>実行結果</code><code></code><code></code><code></code>case 条件文 <p></p><p></p>#case<p> は、<img src="https://img.php.cn/upload/article/000/000/024/fe178bfb1a0eb7dd09df67d79c722d95-4.png" alt="mysql ストアド プロシージャはどのような用途に使用されますか?"> に似た別の条件文です。プログラミング言語 #、</p>when<h4> 構文で ## を選択します。 MySQL の <a id="case__169">case</a> ステートメントには 2 つの構文 <strong> 形式があります。 </strong>
    </h4>ストアド プロシージャを定義し、整数を入力し、case ステートメントを使用してそれが正の数か負の数かを判断します。コードは次のとおりです: <p></p><pre class="brush:php;toolbar:false">-- 创建过程
    create procedure mypro3(in num int)
    begin
    case -- 条件开始
    when num<code>実行結果</code><code></code><code></code>ストアド プロシージャを定義し、整数を入力し、case ステートメントを使用してそれが 1 か 2 かを判断します。コードは次のとおりです。 <code><pre class="brush:php;toolbar:false">-- 创建过程
    create procedure mypro4(in num int)
    begin
    case num -- 条件开始
    when 1 then select '数值是 1';
    when 2 then select '数值是 2';
    else select '不是 1 也不是 2';
    end case; -- 条件结束
    end;
    -- 调用过程
    call mypro4(3);
    ログイン後にコピー
    実行結果

    mysql ストアド プロシージャはどのような用途に使用されますか?

    两种 case 语法都可以实现条件判断,但第一种适合范围值判断,而第二种适合确定值判断。

    while 循环语句

    while语句的用法和 java中的 while循环类似。

    定义存储过程,使用 while 循环输出 1 到 10 的累加和,代码如下所示:

    -- 创建过程
    create procedure mypro5(out sum int)
    begin
    declare num int default 0;
    set sum = 0;
    while num<p>运行结果</p><p><img src="https://img.php.cn/upload/article/000/000/024/fcb90e661eadc288d2d1d57364b7978a-7.png" alt="mysql ストアド プロシージャはどのような用途に使用されますか?"></p><h4>
    <a id="repeat__243"></a><strong>repeat 循环语句</strong>
    </h4><p><code>repeat</code>语句的用法和 <code>java</code>中的 <code>do…while</code> 语句类似,都是先执行循环操作,再判断条件,区别是 <code>repeat</code>表达<br> 式值为 <code>false</code>时才执行循环操作,直到表达式值为 <code>true</code>停止。</p><p>定义存储过程,使用 repeat 循环输出 1 到 10 的累加和,代码如下所示:</p><pre class="brush:php;toolbar:false">-- 创建过程
    create procedure mypro6(out sum int)
    begin
    declare num int default 0;
    set sum = 0;
    repeat-- 循环开始
    set num = num+1;
    set sum = sum+num;
    until num>=10
    end repeat; -- 循环结束
    end;
    -- 调用过程
    call mypro6(@sum);
    -- 查询变量值
    select @sum;
    ログイン後にコピー

    运行结果

    mysql ストアド プロシージャはどのような用途に使用されますか?

    loop 循环语句

    循环语句,用来重复执行某些语句。

    执行过程中可使用 leave语句或 iterate 跳出循环,也可以嵌套 IF等判断语句。

    • leave语句效果相当于 java 中的 break,用来终止循环;
    • iterate语句效果相当于 java 中的 continue,用来结束本次循环操作,进入下一次循环。

    定义存储过程,使用 loop 循环输出 1 到 10 的累加和,代码如下所示:

    -- 创建过程
    create procedure mypro7(out sum int)
    begin
    declare num int default 0;
    set sum = 0;
    loop_sum:loop-- 循环开始
    set num = num+1;
    set sum = sum+num;
    if num>=10 then
    leave loop_sum;
    end if;
    end loop loop_sum; -- 循环结束
    end;
    -- 调用过程
    call mypro7(@sum);
    -- 查询变量值
    select @sum;
    ログイン後にコピー

    运行结果

    mysql ストアド プロシージャはどのような用途に使用されますか?

    代码中的 loop_sum 相当于给循环贴个标签,方便多重循环时灵活操作。

    存储过程的管理

    存储过程的管理主要包括:显示过程、显示过程源码、删除过程。

    比较简单的方式就是利用 navicat 客户端工具进行管理,鼠标点击操作即可,如下图所示:

    mysql ストアド プロシージャはどのような用途に使用されますか?

    显示存储过程

    SHOW PROCEDURE STATUS;
    ログイン後にコピー

    显示特定数据库的存储过程

    SHOW PROCEDURE status where db = 'schooldb';
    ログイン後にコピー

    显示特定模式的存储过程,要求显示名称中包含“my”的存储过程

    SHOW PROCEDURE status where name like '%my%';
    ログイン後にコピー

    显示存储过程“mypro1”的源码

    SHOW CREATE PROCEDURE mypro1;
    ログイン後にコピー

    mysql ストアド プロシージャはどのような用途に使用されますか?

    删除存储过程“mypro1”

    drop PROCEDURE mypro1;
    ログイン後にコピー

    【相关推荐:mysql视频教程

    以上がmysql ストアド プロシージャはどのような用途に使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート