データベース(MySQL)のストアドプロシージャとストアドファンクション

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

ストアド プロシージャは、事前にコンパイルされてデータベースに保存されている SQL ステートメントの集合です。ストアド プロシージャを呼び出すと、アプリケーション開発者の多くの作業が簡素化され、データベースとアプリケーション サーバー間のデータ送信が削減されます。データ処理の効率向上に役立ちます。ストアド プロシージャの概念は非常に単純で、コードをカプセル化し、データベースの SQL 言語レベルで再利用するものです。

特徴

  1. カプセル化、再利用
  2. パラメータを受け取ってデータを返すことができます
  3. ネットワークの相互作用を減らし、効率を向上させる

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 は渡されたパラメーター値です。

おすすめ

転載: blog.csdn.net/weixin_55772633/article/details/132640169