ホームページ  >  記事  >  データベース  >  mysql のストアド プロシージャとストアド関数とは何ですか?

mysql のストアド プロシージャとストアド関数とは何ですか?

青灯夜游
青灯夜游オリジナル
2020-10-15 11:36:143749ブラウズ

mysql では、ストアド プロシージャとストアド関数は、データベース内で定義された SQL ステートメントのコレクションです。このうち、ストアド ファンクションは return ステートメントを通じて関数値を返すことができ、主に値を計算して返すために使用されますが、ストアド プロシージャは値を直接返さず、主に操作を実行するために使用されます。

mysql のストアド プロシージャとストアド関数とは何ですか?

(推奨チュートリアル: mysql ビデオ チュートリアル)

mysql のストアド プロシージャ

ストアド プロシージャの作成は簡単ではありませんが、ストアド プロシージャを使用すると、操作が簡素化され、冗長な操作手順が削減され、同時に操作中のエラーが減り、効率が向上します。可能な限りストアド プロシージャの使用方法を学ぶ必要があります。

ここではストアドプロシージャの作成方法を中心に紹介します。

CREATE PROCEDURE ステートメントを使用してストアド プロシージャを作成できます。構文形式は次のとおりです:

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>

[プロセス パラメータ[,…]] 形式

[ IN | OUT | INOUT ] <参数名> <类型>

構文の説明は次のとおりです:

1) プロシージャ名

デフォルトで現在のデータベースに作成されるストアド プロシージャの名前。特定のデータベースにストアド プロシージャを作成する必要がある場合は、名前の前にデータベースの名前 (db_name.sp_name) を付けます。

名前には、MySQL 組み込み関数と同じ名前を選択しないように注意してください。そうしないと、エラーが発生します。

2) プロセス パラメーター

ストアド プロシージャのパラメーター リスト。このうち、4a82531f3fde107146fdd03610e22e4b はパラメータ名、30690cee1a11d5dfbdced93b89f678ee はパラメータのタイプ (任意の有効な MySQL データ タイプにすることができます) です。パラメータが複数ある場合は、パラメータリスト内でパラメータをカンマで区切ります。ストアド プロシージャにはパラメータを含めることはできません (この場合、ストアド プロシージャの名前の後にかっこのペアを追加する必要があります)、または 1 つ以上のパラメータを含めることもできます。

MySQL ストアド プロシージャは、入力パラメータ、出力パラメータ、入出力パラメータという 3 種類のパラメータをサポートしており、それぞれ IN、OUT、INOUT の 3 つのキーワードで識別されます。このうち、入力パラメータはストアド プロシージャに渡すことができ、出力パラメータはストアド プロシージャが演算結果を返す必要がある場合に使用され、入出力パラメータは入力パラメータと出力パラメータの両方として機能します。

パラメータの名前は、データ テーブルの列名と同じであってはいけないことに注意してください。そうでない場合、エラー メッセージは返されませんが、ストアド プロシージャの SQL ステートメントは、パラメータ名を列名として使用すると、エラーが発生します。予測可能な結果。

3) プロシージャ本体

ストアド プロシージャの主要部分 (ストアド プロシージャ本体とも呼ばれます) には、プロシージャの呼び出し時に実行する必要がある SQL ステートメントが含まれています。このセクションはキーワード BEGIN で始まり、キーワード END で終わります。ストアド プロシージャ本体に SQL ステートメントが 1 つだけある場合は、BEGIN-END フラグを省略できます。

ストアド プロシージャの作成では、DELIMITER コマンドという非常に重要な MySQL コマンドが頻繁に使用されます。特にコマンド ラインから MySQL データベースを操作するユーザーは、このコマンドの使い方を習得する必要があります。

MySQL では、サーバーが SQL ステートメントを処理するときに、デフォルトでステートメントの終了マークとしてセミコロンが使用されます。ただし、ストアド プロシージャを作成する場合、ストアド プロシージャの本体には複数の SQL ステートメントが含まれる場合があります。これらの SQL ステートメントがステートメントの終了文字としてセミコロンを使用する場合、MySQL サーバーは処理中に最初に検出された SQL ステートメントで終了します。セミコロンが使用されます。プログラム全体のターミネータとして使用すると、ストアド プロシージャ本体の後続の SQL ステートメントは処理されなくなりますが、これは明らかに不可能です。

上記の問題を解決するには、通常、DELIMITER コマンドを使用して終了コマンドを他の文字に変更します。 構文形式は次のとおりです:

DELIMITER $$

構文の説明は次のとおりです:

  • $$ はユーザーです-定義されたターミネータ、通常はこれです。 記号には、2 つの「?」または 2 つの「¥」などの特殊な記号を使用できます。

  • DELIMITER コマンドを使用する場合は、バックスラッシュ「\」文字は MySQL エスケープ文字であるため、使用しないでください。

MySQL コマンド ライン クライアントに次の SQL ステートメントを入力します。

mysql > DELIMITER ??

この SQL ステートメントが正常に実行されると、コマンド、ステートメント、またはプログラムの終了記号は 2 つの疑問符「??」に置き換えられます。

終了記号をデフォルトのセミコロン「;」に戻す場合は、MySQL コマンド ライン クライアントに次のステートメントを入力します:

mysql > DELIMITER ;

注: DELIMITER とセミコロン「;」それらの間にはスペースが必要です。ストアド プロシージャを作成する場合は、CREATE ROUTINE 権限が必要です。

mysql のストアド関数

MySQL では、CREATE FUNCTION ステートメントを使用してストアド関数を作成します。構文は次のとおりです:

CREATE FUNCTION sp_name ([func_parameter[...]])
RETURNS type
[characteristic ...] routine_body

その中に:

  • sp_name パラメータ: ストアド関数の名前を表します;

  • func_parameter: ストアド関数のパラメータ リストを表しますストアド関数;

  • RETURNS タイプ: 戻り値のタイプを指定;

  • characteristic パラメータ: ストアド関数の特性を指定します。このパラメータの値はストアド プロシージャの値と同じです。 ;

  • routine_body パラメータ: SQL コードの内容を示します。開始をマークするには BEGIN...END を使用できます。そしてSQLコードの終わり。

注意:在具体创建函数时,函数名不能与已经存在的函数名重名。除了上述要求外,推荐函数名命名(标识符)为 function_xxx 或者 func_xxx。

func_parameter 可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下:
[IN | OUT | INOUT] param_name type;

其中:

  • IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出;

  • param_name 参数是存储函数的参数名称;

  • type 参数指定存储函数的参数类型,该类型可以是 MySQL 数据库的任意数据类型。

例 1

使用 CREATE FUNCTION 创建查询 tb_student 表中某个学生姓名的函数,SQL 语句和执行过程如下:

mysql> USE test;
Database changed
mysql> DELIMITER //
mysql> CREATE FUNCTION func_student(id INT(11))
    -> RETURNS VARCHAR(20)
    -> COMMENT &#39;查询某个学生的姓名&#39;
    -> BEGIN
    -> RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
    -> END //
Query OK, 0 rows affected (0.10 sec)
mysql> DELIMITER ;

上述代码中,创建了 func_student 函数,该函数拥有一个类型为 INT(11) 的参数 id,返回值为 VARCHAR(20) 类型。SELECT 语句从 tb_student 表中查询 id 字段值等于所传入参数 id 值的记录,同时返回该条记录的 name 字段值。

创建函数与创建存储过程一样,需要通过命令 DELIMITER // 将 SQL 语句的结束符由“;”修改为“//”,最后通过命令 DELIMITER ; 将结束符号修改成 SQL 语句中默认的结束符号。

如果在存储函数中的 RETURN 语句返回一个类型不同于函数的 RETURNS 子句中指定类型的值,返回值将被强制为恰当的类型。比如,如果一个函数返回一个 ENUM 或 SET 值,但是 RETURN 语句返回一个整数,对于 SET 成员集的相应的 ENUM 成员,从函数返回的值是字符串。

拓展阅读

由于存储函数和存储过程的查看、修改、删除等操作几乎相同,所以我们不再详细讲解如何操作存储函数了。

查看存储函数的语法如下:

SHOW FUNCTION STATUS LIKE 存储函数名;
SHOW CREATE FUNCTION 存储函数名;
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=存储函数名;

可以发现,操作存储函数和操作存储过程不同的是将 PROCEDURE 替换成了 FUNCTION。同样,修改存储函数的语法如下:

ALTER FUNCTION 存储函数名 [ 特征 ... ]

存储函数的特征与存储过程的基本一样。

以上がmysql のストアド プロシージャとストアド関数とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。