記事のディレクトリ
ストアドプロシージャの概要
なぜストアドプロシージャを使用するのですか?
MySQL5.0バージョンはストアドプロシージャのサポートを開始しました。
ほとんどのSQLステートメントは、1つ以上のテーブルに対する単一のステートメントです。すべての操作がそれほど単純なわけではありません。多くの場合、完全な操作を完了するには、複数のステートメントが必要です。
簡単に言うと、ストアドプロシージャは、後で使用するために保存される1つ以上のMySQLステートメントのコレクションです。バッチファイルと考えてください。それらの役割はバッチ処理に限定されていませんが。
ストアドプロシージャの考え方は非常に単純です。つまり、コードのカプセル化とデータベースSQL言語レベルでの再利用です。
ストアドプロシージャの利点
- 処理を使いやすい単位にカプセル化することにより、複雑な操作を簡素化します。
- 変更の管理を簡素化します。テーブル名、列名、またはビジネスロジックが変更された場合。ストアドプロシージャのコードを変更するだけで、それを使用する人は自分のコードを変更しません。
- 通常、ストアドプロシージャは、アプリケーションのパフォーマンスを向上させるのに役立ちます。作成されたストアドプロシージャがコンパイルされると、データベースに格納されます。ただし、MySQLによって実装されるストアドプロシージャは少し異なります。MySQLストアドプロシージャはオンデマンドでコンパイルされます。ストアドプロシージャをコンパイルした後、MySQLはそれをキャッシュに入れます。MySQLは、接続ごとに独自のストアドプロシージャキャッシュを維持します。アプリケーションが単一の接続でストアドプロシージャを複数回使用する場合は、コンパイルされたバージョンを使用します。それ以外の場合、ストアドプロシージャはクエリのように機能します。
- アプリケーションは複数の長いSQLステートメントを送信する必要はなく、ストアドプロシージャの名前とパラメーターのみを送信する必要があるため、ストアドプロシージャは、アプリケーションとデータベースサーバー間のトラフィックを削減するのに役立ちます。
- 保存されたプログラムは再利用可能であり、どのアプリケーションに対しても透過的です。ストアドプロシージャはデータベースインターフェイスをすべてのアプリケーションに公開するため、開発者はストアドプロシージャでサポートされている関数を開発する必要はありません。
- 保存されたプログラムは安全です。データベース管理者は、基盤となるデータベーステーブルに権限を付与せずに、データベース内のストアドプロシージャにアクセスするアプリケーションに適切な権限を付与できます。
ストアドプロシージャのデメリット
- 多数のストアドプロシージャを使用すると、これらのストアドプロシージャを使用する各接続のメモリ使用量が大幅に増加します。さらに、ストレージプロセスで多数の論理演算を使いすぎると、CPU使用率も増加します。これは、MySQLデータベースの初期設計が、論理演算を助長しない効率的なクエリに焦点を合わせているためです。
- ストアドプロシージャの構造により、複雑なビジネスロジックを使用したストアドプロシージャの開発がより困難になります。
- ストアドプロシージャをデバッグすることは困難です。ストアドプロシージャをデバッグできるデータベース管理システムはごくわずかです。残念ながら、MySQLはストアドプロシージャをデバッグする機能を提供していません。
- ストアドプロシージャの開発と保守は簡単ではありません。ストアドプロシージャの開発と保守には、通常、すべてのアプリケーション開発者が持っているわけではない専門的なスキルが必要です。これにより、アプリケーションの開発および保守フェーズで問題が発生する可能性があります。
MySQLのストアドプロシージャ
プロシージャを作成して呼び出す
ストアドプロシージャを作成します。コードは次のとおりです。
-- 创建存储过程
create procedure mypro(in a int,in b int,out sum int)
begin
set sum = a+b;
end;
結果は以下のとおりです。
次の図に示すように、Navicatクライアントの「関数」ノードの下にプロセスを表示することもできます。
ストアドプロシージャを呼び出します。コードは次のとおりです。
call mypro(1,2,@s);-- 调用存储过程
select @s;-- 显示过程输出结果
運転結果
ストアドプロシージャの構文解析
create procedure
プロセスの作成に使用されます。mypro
プロセス名を定義するために使用されます。(in a int,in b int,out sum int)
パラメータin
は、入力パラメータをout
示し、出力パラメータを示すプロセスを表します。Javaがメソッドを定義するときの仮パラメータと戻り値に似ています。begin
またend
、プロセスの本体の開始と終了を表します。これは、Java定義メソッドの1組の中括弧に相当します。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条件文
IF
ステートメントには複数の条件付き判断が含まれています。結果TRUE
に応じてFALSE
、ステートメントが実行されますif
。else if
これはelse
、、、およびプログラミング言語の構文に似ています。
ストアドプロシージャを定義し、整数を入力し、ifステートメントを使用して、それが正か負かを判断します。コードは次のとおりです。
-- 创建过程
create procedure mypro2(in num int)
begin
if num<0 then -- 条件开始
select '负数';
elseif num=0 then
select '不是正数也不是负数';
else
select '正数';
end if;-- 条件结束
end;
-- 调用过程
call mypro2(-1);
運転結果
ケース条件文
case
これは、プログラミング言語に似た別の条件文、であるchoose
、when
構文。MySQLcase
ステートメントには2つの構文
形式があります。
ストアドプロシージャを定義し、整数を入力し、caseステートメントを使用して、それが正か負かを判断します。コードは次のとおりです。
-- 创建过程
create procedure mypro3(in num int)
begin
case -- 条件开始
when num<0 then select '负数';
when num=0 then select '不是正数也不是负数';
else select '正数';
end case; -- 条件结束
end;
-- 调用过程
call mypro3(1);
運転結果
ストアドプロシージャを定義し、整数を入力し、caseステートメントを使用して、それが1か2かを判別します。コードは次のとおりです。
-- 创建过程
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);
運転結果
どちらの格文法も条件付き判断を行うことができますが、前者は範囲値判断に適しており、後者は確定値判断に適しています。
whileループステートメント
while
使用方法の説明文とjava
でwhile
同様のサイクル。
ストアドプロシージャを定義し、whileループを使用して、1から10の累積合計を出力します。コードは次のとおりです。
-- 创建过程
create procedure mypro5(out sum int)
begin
declare num int default 0;
set sum = 0;
while num<10 do -- 循环开始
set num = num+1;
set sum = sum+num;
end while; -- 循环结束
end;
-- 调用过程
call mypro5(@sum);
-- 查询变量值
select @sum;
運転結果
ループステートメントを繰り返す
repeat
ステートメントjava
内の使用法とステートメントdo…while
、操作は最初の実行サイクル、次に決定条件、式の式の違いはrepeat
、式の値が停止するまでループ
でfalse
のみ実行されますtrue
。
ストアドプロシージャを定義し、繰り返しループを使用して1から10の累積合計を出力します。コードは次のとおりです。
-- 创建过程
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;
運転結果
ループステートメント
ループステートメントは、特定のステートメントを繰り返し実行するために使用されます。
実行leave
ステートメント中に使用iterate
することも、ループ外でIF
判断ステートメントのようにネストすることもできます。
leave
このステートメントの効果はbreak
、ループを終了するために使用されるjavaの効果と同等です。iterate
このステートメントの効果は、continue
このループ操作を終了して次のループに入るのに使用されるjavaの効果と同等です。
ストアドプロシージャを定義し、ループを使用して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;
運転結果
コード内のloop_sumは、複数のループ中の柔軟な操作を容易にするためにループにラベルを付けることと同じです。
ストアドプロシージャの管理
ストレージプロセスの管理には、主に、プロセスの表示、プロセスのソースコードの表示、およびプロセスの削除が含まれます。
より簡単な方法は、次の図に示すように、管理にNavicatクライアントツールを使用することです。マウスをクリックするだけです。
ストアドプロシージャを表示する
SHOW PROCEDURE STATUS;
特定のデータベースのストアドプロシージャを表示します
SHOW PROCEDURE status where db = 'schooldb';
特定のモードでストアドプロシージャを表示するには、名前に「my」が含まれるストアドプロシージャを表示する必要があります
SHOW PROCEDURE status where name like '%my%';
ストアドプロシージャ「mypro1」のソースコードを表示します
SHOW CREATE PROCEDURE mypro1;
ストアドプロシージャ「mypro1」を削除します
drop PROCEDURE mypro1;