1. ストアド プロシージャの概要
ストアド プロシージャは、事前にコンパイルされてデータベースに保存されている SQL ステートメントの集合です。ストアド プロシージャを呼び出すと、アプリケーション開発者の多くの作業が簡素化され、データベースとアプリケーション サーバー間のデータ送信が削減されます。データ処理の効率向上に役立ちます。ストアド プロシージャの概念は非常に単純で、コードをカプセル化し、データベースの SQL 言語レベルで再利用するものです。
特徴
- カプセル化、再利用
- パラメータを受け取ってデータを返すことができます
- ネットワークの相互作用を減らし、効率を向上させる
2. ストアド プロシージャの基本構文
2.1 作成
CREATE PROCEDURE 存储过程名称( [参数列表] )
BEGIN
SQL 语句
END;
2.2 電話をかける
CALL名([パラメータ])
2.3 ビュー
-- 指定したデータベースのストアド プロシージャとステータス情報をクエリします。
SELECT* FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '对应的数据库名称'
-- ストアド プロシージャの定義をクエリします。
SHOW CREATE PROCEDURE 存储过程名称
2.4 削除
DROP PROCEDURE [ IFEXISTS ] 存储过程名称
3. ストアド プロシージャ内の変数
3.1 システム変数
システム変数は、ユーザー定義ではなく MySQL サーバーによって提供され、サーバー レベルに属します。グローバル変数(GLOBAL)とセッション変数(SESSION)に分かれます。
--システム変数を表示
SHOW [SESSION | GIOBAL] VARIABLFS; --すべてのシステム変数を表示
SHOW [SESSION | GLOBAL] VARUABLES LIKE....; --UKL あいまい一致を通じて変数を見つけることができます
SELECT @@[SESSION | GLOBAL] システム変数名; -- 指定された変数の値を表示します
--システム変数を設定します
SET [ SESSION | GLOBAL] システム変数名 = 値;
SET @@[SESSION | GLOBAL] システム変数名 = 値;
注:
SESSION/GLOBAL が指定されていない場合、デフォルトはセッション変数 SESSION です。
mysql サービスを再起動すると、設定したグローバルパラメータが無効になりますが、無効にならないようにしたい場合は、/etc/my.cnf で設定できます。
3.2 ユーザー定義変数
ユーザー定義変数は、ユーザーが必要に応じて定義した変数で、事前に宣言する必要はなく、使用時に「@変数名」を指定して直接使用できます。そのスコープは現在の接続です。
--代入
SET @var_name = expr [,@var_name = expr ]... ;
SET @var_name := expr [,@var_name := exprl] ... ;
SELECT @var_name :=expr [,@var_name :=expr ] ..- ;
SELECT フィールド名 INTO@var_name FROM テーブル名;
-- SELECT @var_nameを使用します
。
知らせ:
ユーザー定義変数は宣言または初期化する必要はなく、宣言または初期化しない場合、取得される値は NULL になります。以下に示すように: @abc が宣言されていないため、カスタム変数 @abc を表示すると null が返されます。
3.3 ローカル変数
ローカル変数は、必要に応じて定義され、ローカルで有効になる変数で、アクセスする前に DECLARE 文が必要です。ストアド プロシージャ内のローカル変数および入力パラメータとして使用できます。ローカル変数のスコープは、その中で宣言された BEGIN.... END ブロックです。
DECLARE 変数名 変数タイプ [DEFAULT...]を宣言します
。変数タイプはデータベース フィールドのタイプです: INT、BIGINT、CHAR.VARCHAR.DATE、TIME など。
代入
SET 変数名 = 値;
SET 変数名:= 値;
SELECT フィールド名 INTO 変数名 FROM テーブル名....;
4. ストアド プロシージャ – プロセス制御
4.1 ストアドプロシージャのif判定
構文:
IF 条件 1 THEN
ELSEIF 条件 2 THEN -- オプション
ELSE -- オプション
END IF;
ストアド プロシージャを定義して、次の要件を満たします。
定義されたスコア scre 変数に基づいて、現在のスコアに対応するスコア レベルを決定します。
1.スコア >= 85 ポイント、レベルは優れています。
2. スコアが 60 点以上、スコアが 85 点未満の場合、合格となります。
3. スコア < 60 点、成績は不合格です。
4.2 ストアド プロシージャ パラメータ
使用法:
CREATE PROCEDURE ストアド プロシージャ名 ([IN/OUT/INOUT パラメータ名 パラメータの種類])
BEGIN
--SQL 文
END;
ストアド プロシージャを定義して、次の要件を満たします。
1. 受信パラメータのスコアに基づいて、現在のスコアに対応するスコア レベルを決定し、それを返します。
①スコア >=85 点、レベルは優れています。
②スコア >= 60 点、スコア <85 点であれば合格です。
③得点<60点の場合は不合格です。
2. 入力された 200 点のスコアを 100 点システムに変換して返します。
4.3の場合
ストアド プロシージャを定義して、次の要件を満たします。
次の月に基づいて、その月が属する季節を決定します (格構造が必要です)。
1. 1月~3月が第1四半期
2. 4月~6月が第2四半期
3. 7月~9月が第3四半期
4. 10月~12月が第4四半期
5. ストアド プロシージャ - ループ
5.1 ループ時間
ストアド プロシージャを定義して、次の要件を満たします。
1 から n までの累積値を計算します。n は渡されたパラメーター値です。
5.2 ループリピート
繰り返しループ制御ステートメントは少なくとも 1 回実行され、条件が満たされると終了します。
ストアド プロシージャを定義して、次の要件を満たします。
1 から n までの累積値を計算します。n は渡されたパラメーター値です。
5.3 ループループ
LOOP は単純なループを実装します。SQL ロジックにループを終了するための条件を追加しない場合、これを使用して単純な無限ループを実装できます。LOOP は、次の 2 つのステートメントで使用できます。
① LEAVE: サイクルと組み合わせてサイクルを終了するために使用します。
② ITERATE: ループ内で使用する必要があり、その機能は、現在のループの残りのステートメントをスキップし、次のループに直接入ることです。
文法:
[begin_label:] LOOP
SQL ..
END LOOP [end_label];
LEAVE label; --指定したラベルのループ本体を終了
ITERATE label; --直接次のループに入る
ストアド プロシージャを定義して、次の要件を満たします。
1. 1 から n までの累積値を計算します。ここで、n は渡されたパラメータ値です。
2. 1 から n までの偶数の累積値を計算します。ここで、n は渡されたパラメータ値です。
6. ストアド プロシージャ-カーソル-カーソル
カーソル (CURSOR) は、クエリ結果セットを格納するために使用されるデータ型です。カーソルはストアド プロシージャや関数で使用され、結果セットをループで処理することができます。カーソルの使用には、カーソル宣言、OPEN、FETCH、および CLOSE が含まれ、その構文は次のとおりです。
カーソルの宣言
DECLARE カーソル名 CURSOR FOR クエリ文;
カーソルをオープンする
OPEN カーソル名;
カーソル レコードを取得する
FETCH カーソル名 INTO 変数 [, 変数];
カーソルを閉じる
CLOSE カーソル名;
ストアド プロシージャを定義して、次の要件を満たします。
受信パラメータ uage に従って、年齢が uage のユーザー名と職業以下であるすべてのユーザーについてユーザー テーブル tb_user をクエリし、そのユーザーの名前と職業を作成された新しいテーブル tb_user_pro ( id ,name,profession) に挿入します
。
--ロジック:
① カーソルを宣言し、クエリ結果セットを保存します。
②準備:テーブル構造の作成
③カーソルを開く
④カーソル内のレコードを取得します
⑤新規テーブルにデータを挿入します
⑥カーソルを閉じる
完全なストアド プロシージャ ステートメントは次のとおりです。
create procedure p1l(in uage int)
begin
declare uname varchar(100);
decLare upro varchar(100);
declare u_cursor cursor for select name,profession from tb_user where age <= uage;
当 条件处理程序的处理的状态码为02000的时候,就会退出。
declare exit handler for SQLSTATE '02000'close u_cursor;
drop table if exists tb_user_pro;
create table if not exists tb_user_pro(
id int primary key auto_increment,
name varchar(100),
profession varchar(100)
);
open u_cursor;
while true do
fetch u_cursor into uname,Upro;
insert into tb_user_pro values(null,uname,Upro);
end while;
close u_cursor;
end;
7. ストアド プロシージャ - 条件ハンドラー - ハンドル
8. ストレージ機能
次の要件を満たすためにストレージ関数を定義します。
1 から n までの累積値を計算します。n は渡されたパラメーター値です。