MySQL の基本 3: 関数とストアド プロシージャ

6. 組み込み関数とカスタム関数

6.1 組み込み関数

  1. 文字関数
  2. 数値演算子と関数
  3. 比較演算子と関数
  4. 日時関数
  5. 情報機能
  6. 集計関数
  7. 暗号化機能

6.2 カスタム関数の概要

  1. カスタム関数の構文形式
CREATE FUNCTION 函数名(参数名 参数类型) # mysql中参数数量不能超过1024个(一般没问题)
RETURNS {
    
    返回值类型}
函数体 #(函数体中如果为复合结构要用BEGIN...END语句;复合结构可以包含声明、循环、流程控制等;)
  1. パラメーターなしでカスタム関数を作成する
# 创建无参函数
CREATE FUNCTION f1() 
RETURNS VARCHAR(40)
DETERMINISTIC	# 确定性声明(不然会报错:> 1418-This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in...)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');  # RETURN表示有返回值

# 函数调用
SELECT f1();
  1. パラメーターを使用してカスタム関数を作成する
# 创建带参的函数
CREATE FUNCTION f2(num1 INT,num2 INT) # 两个参数
RETURNS FLOAT(10,2)			# 返回值类型为float
DETERMINISTIC
RETURN (num1+num2)/3;		# 一个返回值

SELECT f2(3,2);
  1. 複合構造の関数本体を使用してカスタム関数を作成します。
    複数のステートメントを実行する場合は、begin で始まり end で終わる必要があります。begin と end の間に複数の実行ステートメントを置きます。戻り値がクエリ ステートメントの場合は、括弧で囲む必要があります。
# 创建带参的函数
delimiter //
CREATE FUNCTION fAddUser2(username11 VARCHAR(20),unit11 VARCHAR(20)) 
RETURNS INT
DETERMINISTIC
BEGIN
INSERT test_user(username) VALUES (username11);
INSERT test_unit(unit) VALUES (unit11);
RETURN (SELECT COUNT(id) FROM test_unit);# 注意返回值这里要带括号
END
//
delimiter ;

SELECT fAddUser2('马超','蜀汉');

7. ストアド プロシージャ

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

利点:
2 回および複数回呼び出された場合の実行速度が速い (構文解析とコンパイルが不要)、
ネットワーク トラフィックの削減、
データ テーブルとデータベースの作成不可、
パラメーターのないストアド プロシージャのかっこは省略可能、
ストアド プロシージャ内のパラメーターの名前データと組み合わせることはできません テーブルのフィールドは同じ名前です

7.2 パラメータなしでストアド プロシージャを作成する

わずかに

7.3 IN 型パラメータを使用したスト​​アド プロシージャの作成

わずかに

7.4 IN および OUT タイプのパラメータを使用したスト​​アド プロシージャの作成

# 修改结束符号
delimiter //
# 创建存储过程
CREATE PROCEDURE delUserAndReturnUserNums(IN p_id INT, OUT userNums INT)
BEGIN
DELETE FROM test_user WHERE id = p_id;
SELECT count(id) FROM test_user INTO userNums;# 通过into将数值放到变量中
END //
# 将结束符号修改回来
delimiter ;


# 存储过程的调用与返回值的查看
CALL delUserAndReturnUserNums(10,@nums);	# 用@来定义变量
SELECT @nums;

7.5 複数の OUT タイプのパラメータを使用したスト​​アド プロシージャの作成

delimiter //	# 修改结束符号 ";" 为 "//"
CREATE PROCEDURE removeUserByAgeAndReturnInfos(	# 创建名为removeUserByAgeAndReturnInfos的存储过程
 IN p_age INT,	# IN输入变量,
 OUT deleteUsers INT,# OUT输出变量1
 OUT userRemain INT# OUT输出变量2
 )
BEGIN	# 过程体开始
DELETE FROM test_user WHERE age = p_age;# 按照年龄删除用户
SELECT ROW_COUNT() INTO deleteUsers;# 相当于php中mysql_affected_rows指的是被影响的行数,利用INTO放入OUT类型的变量1中
SELECT COUNT(id) FROM test_user INTO userRemain;# 将剩余用户的个数利用into放入OUT类型的变量2中
END 	# 过程体结束
//	# 整个存储过程结束
delimiter ;	# 将结束符号修改回来
CALL removeUserByAgeAndReturnInfos(20,@deleteUsers,@userRemain);	# 使用CALL调用存储过程,并用@符号定义变量
SELECT @deleteUsers,@userRemain;# 查看变量的值

概要: ストアド プロシージャと関数の違い:

  1. ストアド プロシージャによって実装される関数はより複雑ですが、関数はよりターゲットが絞られています。
  2. エラー保存プロセスは複数の値を返すことができますが、関数は 1 つの値しか持てません (または、テーブルまたは JSON 文字列を使用して、複数の値に関する情報を偽装して出力します)。
  3. ストアド プロシージャは通常、独立して実行されますが、関数は他の SQL ステートメントのコンポーネントとして現れることがあります (使用法は count() などの組み込み関数の使用法と同じです)。

おすすめ

転載: blog.csdn.net/qq_38662733/article/details/122228524