MySQL クイック チェック - カスタム関数とストアド プロシージャ

MySQLのクイックチェック

日々の仕事や勉強の中で、mysql のステートメント、キーワード、操作などを忘れることがよくあるため、最近少し時間をとって mysql に関する次の内容を書きました。辞書のようなものです


mysql パスワードのリセット
データ型
演算子共通関数データの整合性データベースの基本操作 テーブル
自体の操作 テーブル内のデータの操作サブクエリマルチテーブル接続インデックスビューSQL ステートメントの前処理この記事はMySQL でプログラミングしています。











関数とストアド プロシージャの公式説明:
CREATE PROCEDURE ステートメントと CREATE FUNCTION ステートメント

カスタム機能

MySQL 関数の概念は、C などのプログラミング言語の概念に似ています。

カスタム関数の作成

create function func_name([[in | out | inout]func_parameter type[, ...]])
returns return_type
[characteristic...]
begin
	# 函数体;
	return [return_values];
end;
# func_name 函数名
# [in | out | inout] in表示输入参数,out表示输出参数,inout表示输入输出参数
# func_parameter 参数名
# type 参数类型
# return_type 函数返回值类型
# characteristic 指定函数的特征参数,可选值:
	language sql
	# 默认选项,用于说明函数体使用SQL语言编写
	| [not] deterministic
	# detrministic(确定性),当函数返回值不确定时,该选项是为了防止“复制”时的不一致。如果
	# 函数总是对同样的输入参数产生同样的结果,则被认为是“确定的”,否则认为是“不确定的”。
	# 不指定默认是“not deterministic”
	| {
   
   contains sql | no sql | reads sql data | modifies sql data}
	# 指明子程序使用SQL语句的限制。
	# contains sql 表示函数体中不包含读或写数据的语句,如set
	# no sql 表示函数体中不包含SQL语句
	# reads sql data 表示函数体中包含select查询语句,但不包含更新语句
	# modifies sql data 表示函数体包含更新语句
	# 不指明默认时contains sql
	| sql security {
   
   definer | invoker}
	# 设置执行权限。用于指定函数的执行许可
	# definer表示该函数只能由创建者调用
	# invoker 表示该函数可以被其他数据库用户调用
	# 默认是definer
	| comment 'string'
	# 注释,引号内就是要添加的注释内容

例:

# 创建一个做减法的函数
delimiter //
create function sub(arg1 int, arg2 int)
returns int
DETERMINISTIC
begin
	return arg1 - arg2;
end //
delimiter ;

# 调用自定义函数与调用MySQL中的系统函数的方法一样
select sub(3, 1);
+-----------+
| sub(3, 1) |
+-----------+
|         2 |
+-----------+
1 row in set (0.00 sec)

デリミタ

MySQL は区切り文字を使用してコマンドの終了マーカーを変更します。デフォルトの終了タグは「;」です。
なぜ終了タグを変更するのでしょうか?
上記の例のように、関数やストアドプロシージャには「;」がたくさんあるため、サブ関数内の「return arg1 - arg2;」文に「;」がある場合、ターミネータを変更しないと、サブ関数の場合、このステートメントを記述するときに Enter キーと改行キーを押します。「;」がデフォルトの終了マークであるため、MySQL はこの時点でそれを実行しようとします。関数の記述が完了していないため、次の時点でエラーが報告されます。したがって、関数を作成するとき、またはプロシージャを保存するときは、最初に終了文字を別の文字に変更し、作成後に元に戻す必要があります。

関数定義の表示

show function status;  # 查看全部函数
show function status like 模式;  # 模糊查询
show create function 函数名;  # 精确查看

show function status;  # 查出的内容太多,不方便
+-------+----------------------------------+----------+---------------------+---------------------+---------------------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Db    | Name                             | Type     | Definer             | Modified            | Created             | Security_type | Comment                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | character_set_client | collation_connection | Database Collation |
+-------+----------------------------------+----------+---------------------+---------------------+---------------------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| sys   | extract_schema_from_file_name    | FUNCTION | mysql.sys@localhost | 2021-07-27 13:37:12 | 2021-07-27 13:37:12 | INVOKER       | 
Description
-----------
...太多了


############################################################

show function status like 'su%';  # 模糊查询
+-------+------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db    | Name | Type     | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| testt | sub  | FUNCTION | root@localhost | 2021-10-21 17:24:39 | 2021-10-21 17:24:39 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+-------+------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)

################################################

show create function sub;
+----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Function | sql_mode                                                                                                              | Create Function                                                                                                                  | character_set_client | collation_connection | Database Collation |
+----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| sub      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `sub`(arg1 int, arg2 int) RETURNS int
    DETERMINISTIC
begin
return arg1 - arg2;
end | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

関数情報は、information_schemaデータベースのルーチンテーブルに保存されます。

select * from information_schema.routines where routine_name = 'sub';
+---------------+-----------------+----------------+--------------+--------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+----------------+----------------+--------------+-------------------------------+---------------+-------------------+-----------------+------------------+-----------------+----------+---------------+---------------------+---------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------------+----------------------+--------------------+
| SPECIFIC_NAME | ROUTINE_CATALOG | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | DATETIME_PRECISION | CHARACTER_SET_NAME | COLLATION_NAME | DTD_IDENTIFIER | ROUTINE_BODY | ROUTINE_DEFINITION            | EXTERNAL_NAME | EXTERNAL_LANGUAGE | PARAMETER_STYLE | IS_DETERMINISTIC | SQL_DATA_ACCESS | SQL_PATH | SECURITY_TYPE | CREATED             | LAST_ALTERED        | SQL_MODE                                                                                                              | ROUTINE_COMMENT | DEFINER        | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+---------------+-----------------+----------------+--------------+--------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+----------------+----------------+--------------+-------------------------------+---------------+-------------------+-----------------+------------------+-----------------+----------+---------------+---------------------+---------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------------+----------------------+--------------------+
| sub           | def             | testt          | sub          | FUNCTION     | int       |                     NULL |                   NULL |                10 |             0 |               NULL | NULL               | NULL           | int            | SQL          | begin
return arg1 - arg2;
end |          NULL | SQL               | SQL             | YES              | CONTAINS SQL    |     NULL | DEFINER       | 2021-10-21 17:24:39 | 2021-10-21 17:24:39 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |                 | root@localhost | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+---------------+-----------------+----------------+--------------+--------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+----------------+----------------+--------------+-------------------------------+---------------+-------------------+-----------------+------------------+-----------------+----------+---------------+---------------------+---------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

カスタム関数の削除

drop function func_name;

カスタム関数を変更する

alter function func_name[characteristic ...];
characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}
# 解释在“创建自定义函数”

関数の変更

ストアドプロシージャ

ストアド プロシージャは、複雑なプログラムをデータベースに保存し、外部プログラムから呼び出せるようにするデータベース オブジェクトです。ストアド プロシージャは、特定の機能を完了するための SQL ステートメントのセットです。ストアド プロシージャはコンパイルされ、作成され、データベースに保存されます。ユーザーは、ストアド プロシージャの名前を指定し、パラメータ (必要に応じて) を指定することで、ストアド プロシージャを呼び出して実行できます。

  • アドバンテージ
    • ストアド プロシージャは、複雑なビジネス ロジックをカプセル化して非表示にすることができます。
    • ストアド プロシージャは値を返し、パラメータを受け入れることができます。
    • ストアド プロシージャは、ルックアップ テーブル、データ テーブル、またはユーザー定義関数とは異なり、サブルーチンであるため、SELECT 命令を使用して実行できません。
    • ストアド プロシージャは、データ検証、ビジネス ロジックの適用などに使用できます。
  • 欠点がある
    • サポートされているプログラミング言語が異なるため、ストアド プロシージャは特定のデータベース用にカスタマイズされることがよくあります。他のメーカーのデータベース システムに切り替える場合は、元のストアド プロシージャを書き直す必要があります。
    • パフォーマンスのチューニングとストアド プロシージャの作成は、さまざまなデータベース システムによって制限されます。

——ルーキーチュートリアル

ストアド プロシージャを作成する

CREATE
    [DEFINER = user]
    PROCEDURE proc_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
proc_parameter:
    [ IN | OUT | INOUT ] param_name type
characteristic: {  # 同“创建自定义函数”
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
    存储过程体,这部分以begin开始,end结束。当只有一个SQL语句时可省略begin...end

ストアド プロシージャを呼び出す

CALL proc_name([parameter[,...]])
CALL proc_name[()]

例:

# 存在表
desc people;
+-------+---------------+------+-----+---------+----------------+
| Field | Type          | Null | Key | Default | Extra          |
+-------+---------------+------+-----+---------+----------------+
| id    | int           | NO   | PRI | NULL    | auto_increment |
| name  | char(10)      | NO   |     | NULL    |                |
| age   | int           | NO   |     | NULL    |                |
| sex   | enum('f','m') | YES  |     | NULL    |                |
| sar   | float         | YES  |     | NULL    |                |
+-------+---------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

# 创建一个通过id获取people的存储过程
delimiter //
create procedure get_people_by_id(in p_id int)
reads sql data
begin
	select * from people where id = p_id;
end //
delimiter ;

# 使用存储过程
call get_people_by_id(3);
+----+--------+-----+------+--------+
| id | name   | age | sex  | sar    |
+----+--------+-----+------+--------+
|  3 | 嘎子   |  18 | m    | 5400.4 |
+----+--------+-----+------+--------+
1 row in set (0.00 sec)

ストアドプロシージャを削除する

DROP PROCEDURE [IF EXISTS] proc_name;

ストアド プロシージャを変更する

ALTER PROCEDURE proc_name [characteristic ...]

characteristic: { # 含义同“创建自定义函数”小节所讲
    COMMENT 'string'
  | LANGUAGE SQL
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

関数 VS ストアド プロシージャ

  • 類似性
    1. どちらも再利用可能で、開発者の作業負荷を軽減できます。
    2. どちらもデータのセキュリティ アクセス制御を強化し、特定のデータベース ユーザーのみに特定の関数またはストアド プロシージャの実行権限を設定できます。
  • 違い
    1. 関数は戻り値を 1 つだけ持つ必要があり、戻り値は文字列または数値データ型として指定する必要があります。ストアド プロシージャは戻り値を 1 つだけ持つことも、戻り値を持たないことも、複数の戻り値を持つこともできるため、戻り値は out を使用する必要があります。または inout パラメータ定義
    2. 関数本体では、select...into ステートメントを使用して変数に値を割り当てることができますが、select を使用して結果セットを返すことはできません。ストアド プロシージャにはこの点に関する制限はありません
    3. 関数は SQL ステートメントまたは MySQL 式に直接埋め込むことができます。ストアド プロシージャは通常、個別に呼び出す必要があり、呼び出すときにキーワード call が必要です。
    4. 関数内の関数本体には多くの制限があります。たとえば、明示的または暗黙的にトランザクションを開始、開始、または終了するステートメントは関数本体内で使用できません。前処理された SQL ステートメントは使用できません。ストアド プロシージャに対する制限は比較的少ないです。 、基本的にすべての SQL ステートメントまたは MySQL コマンドをストアド プロシージャで使用できます。

エラー ERROR 1418 (HY000)

カスタム関数またはストアド プロシージャを作成し、このエラーが報告された場合は、エラー メッセージに従って変更してください。

  1. DETERMINISTIC、NO SQL、または READS SQL DATA を関数に追加します
  2. 変数 log_bin_trust_function_creators = 1 を設定します。
    ここでは方法 1 を使用しています。
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

おすすめ

転載: blog.csdn.net/weixin_45345384/article/details/120887707