mysql/>MySQL ストアド プロシージャ
14.1.1 ストアドプロシージャの作成
MySQL では、ストアド プロシージャを作成する基本的な形式は次のとおりです:
プロシージャの作成 sp_name ([proc_parameter[,...]])
[特徴 ...] ルーチンボディ
proc_parameter の各パラメータは 3 つの部分で構成されます。これら 3 つの部分は、入力タイプと出力タイプ、パラメータ名、パラメータ タイプです。その形式は次のとおりです:
[ IN | INOUT ] パラメータ名タイプ このうち、IN は入力パラメータを表し、INOUT は入力パラメータまたは出力パラメータのいずれかを表します。type パラメータはストアド プロシージャのパラメータの種類を指定します。 、MySQL データベースの任意のデータ型にすることができます。
特性パラメータには複数の値があります。その値の説明は次のとおりです:
言語 SQL: ルーチン本体部分は SQL 言語ステートメントで構成されており、データベース システムのデフォルト言語でもあることを説明します。
[NOT] DETERMINISTIC: ストアド プロシージャの実行結果が決定的かどうかを示します。 DETERMINISTIC は、結果が決定的であることを意味します。ストアド プロシージャが実行されるたびに、同じ入力が同じ出力になります。 NOT DETERMINISTIC は、結果が非決定的であり、同じ入力が異なる出力になる可能性があることを意味します。デフォルトでは、結果は非決定的です。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }: サブプログラムによる SQL ステートメントの使用の制限を示します。 CONTAINS SQL は、サブプログラムに SQL ステートメントが含まれているが、データの読み取りまたは書き込みを行うステートメントが含まれていないことを意味します。 NO SQL は、サブプログラムに SQL ステートメントが含まれていないことを意味します。サブプログラムにデータを読み取るステートメントが含まれていること。デフォルトでは、システムは CONTAINS SQL を指定します。
SQL SECURITY { DEFINER | INVOKER }: 実行権限を持つユーザーを示します。 DEFINER は定義者のみが実行できることを意味し、INVOKER は呼び出し側が実行できることを意味します。デフォルトでは、システム指定の権限は DEFINER です。
COMMENT 'string': コメント情報。
ヒント: ストアド プロシージャを作成するとき、システムはデフォルトで CONTAINS SQL を指定し、ストアド プロシージャで SQL ステートメントが使用されることを示します。ただし、ストアド プロシージャで SQL ステートメントが使用されていない場合は、NO SQL に設定するのが最善です。さらに、ストアド プロシージャのコードを後で読みやすくするために、COMMENT セクションでストアド プロシージャに簡単なコメントを付けることをお勧めします。
[例 14-1] 以下の num_from_employee という名前のストアド プロシージャを作成します。コードは次のとおりです:
リーリー
上記のコードでは、ストアド プロシージャ名は num_from_employee、入力変数は emp_id、出力変数は count_num です。 SELECT ステートメントは、従業員テーブルから d_id 値が emp_id と等しいレコードをクエリし、COUNT(*) を使用して同じ d_id 値を持つレコードの数を計算し、最後に計算結果を count_num に格納します。コードの実行結果は次のようになります:
リーリー
コードの実行後、エラー メッセージが報告されない場合は、ストレージ関数が正常に作成されたことを意味します。このストアド プロシージャは後で呼び出すことができ、ストアド プロシージャ内の SQL ステートメントがデータベース内で実行されます。
注: MySQL のデフォルトのステートメント終了文字はセミコロン (;) です。ストアド プロシージャ内の SQL ステートメントはセミコロンで終了する必要があります。競合を避けるために、まず「DELIMITER &&」を使用して MySQL ターミネータを && に設定します。最後に、「DELIMITER;」を使用してターミネータをセミコロンに戻します。これはトリガーを作成する場合と同じです。
14.1.2 ストアド関数の作成MySQL では、ストアド関数を作成する基本的な形式は次のとおりです:
リーリー
このうち、sp_name パラメータはストアド関数の名前、func_parameter はストアド関数のパラメータ リストを表し、characteristic パラメータはストアド関数の特性を指定します。ストアド プロシージャの値と同じです。セクション 14.1.1 の内容を参照してください。routine_body パラメータは SQL コードの内容であり、BEGIN...END を使用して開始と終了をマークできます。 SQLコード。
func_parameter は複数のパラメータで構成できます。各パラメータはパラメータ名とパラメータ タイプで構成され、その形式は次のとおりです:
param_name タイプ
このうち、param_name パラメータはストアド関数のパラメータ名で、type パラメータはストアド関数のパラメータのタイプを指定します。これには、MySQL データベースの任意のデータ型を指定できます。
[例14-2] 次にname_from_employeeという名前のストアドファンクションを作成します。コードは次のとおりです:
リーリー
上記のコードでは、ストレージ関数の名前は name_from_employee で、この関数のパラメータは emp_id で、戻り値は VARCHAR 型です。 SELECT ステートメントは、num 値が emp_id と等しいレコードを従業員テーブルからクエリし、レコードの name フィールドの値を返します。コードの実行結果は次のようになります:
リーリー
結果は、ストレージ関数が正常に作成されたことを示しています。この関数の使用方法は、MySQL 内部関数の使用方法と同じです。
14.1.3 変数の使用
在存储过程和函数中,可以定义和使用变量。用户可以使用DECLARE关键字来定义变量。然后可以为变量赋值。这些变量的作用范围是BEGIN…END程序段中。本小节将讲解如何定义变量和为变量赋值。 1.定义变量 MySQL中可以使用DECLARE关键字来定义变量。定义变量的基本语法如下: DECLARE var_name[,...] type [DEFAULT value] 其中, DECLARE关键字是用来声明变量的;var_name参数是变量的名称,这里可以同时定义多个变量;type参数用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL。 【示例14-3】 下面定义变量my_sql,数据类型为INT型,默认值为10。代码如下: DECLARE my_sql INT DEFAULT 10 ; 2.为变量赋值 MySQL中可以使用SET关键字来为变量赋值。SET语句的基本语法如下: SET var_name = expr [, var_name = expr] ... 其中,SET关键字是用来为变量赋值的;var_name参数是变量的名称;expr参数是赋值表达式。一个SET语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。 【示例14-4】 下面为变量my_sql赋值为30。代码如下: SET my_sql = 30 ; MySQL中还可以使用SELECT…INTO语句为变量赋值。其基本语法如下: SELECT col_name[,…] INTO var_name[,…] 其中,col_name参数表示查询的字段名称;var_name参数是变量的名称;table_name参数指表的名称;condition参数指查询条件。 【示例14-5】 下面从employee表中查询id为2的记录,将该记录的d_id值赋给变量my_sql。代码如下: SELECT d_id INTO my_sql 14.1.4 定义条件和处理程序 定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。本小节中将详细讲解如何定义条件和处理程序。 1.定义条件 MySQL中可以使用DECLARE关键字来定义条件。其基本语法如下:
FROM table_name WEHRE condition
FROM employee WEHRE id=2 ;
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code
其中,condition_name参数表示条件的名称;condition_value参数表示条件的类型;sqlstate_value参数和mysql_error_code参数都可以表示MySQL的错误。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。
【示例14-6】 下面定义"ERROR 1146 (42S02)"这个错误,名称为can_not_find。可以用两种不同的方法来定义,代码如下:
//方法一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02' ; //方法二:使用mysql_error_code DECLARE can_not_find CONDITION FOR 1146 ;
2.定义处理程序
MySQL中可以使用DECLARE关键字来定义处理程序。其基本语法如下:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
其中,handler_type参数指明错误的处理方式,该参数有3个取值。这3个取值分别是CONTINUE、EXIT和UNDO。CONTINUE表示遇到错误不进行处理,继续向下执行;EXIT表示遇到错误后马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时还不支持这种处理方式。
注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL中现在还不能支持UNDO操作。因此,遇到错误时最好执行EXIT操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行CONTINUE操作。
condition_value参数指明错误类型,该参数有6个取值。sqlstate_value和mysql_error_code与条件定义中的是同一个意思。condition_name是DECLARE定义的条件名称。SQLWARNING表示所有以01开头的sqlstate_value值。NOT FOUND表示所有以02开头的sqlstate_value值。SQLEXCEPTION表示所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值。sp_statement表示一些存储过程或函数的执行语句。
【示例14-7】 下面是定义处理程序的几种方式。代码如下:
//方法一:捕获sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND'; //方法二:捕获mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND'; //方法三:先定义条件,然后调用 DECLARE can_not_find CONDITION FOR 1146 ; DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND'; //方法四:使用SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND'; //方法六:使用SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
上記のコードはハンドラーを定義する 6 つの方法です。最初の方法は、sqlstate_value 値をキャプチャすることです。 sqlstate_value 値が 42S02 の場合、CONTINUE 操作を実行し、「CAN NOT FIND」メッセージを出力します。 2 番目の方法は、mysql_error_code 値をキャプチャすることです。 mysql_error_code 値が 1146 の場合、CONTINUE 操作が実行され、「CAN NOT FIND」メッセージが出力されます。 3 番目の方法は、最初に条件を定義してから、その条件を呼び出すことです。ここでは、まず can_not_find 条件を定義し、1146 エラーが発生したときに CONTINUE 操作を実行します。 4 番目の方法は、SQLWARNING を使用することです。 SQLWARNING は、01 で始まるすべての sqlstate_value 値を取得し、EXIT 操作を実行して「ERROR」情報を出力します。 5 番目の方法は、NOT FOUND を使用することです。 NOT FOUND は、02 で始まるすべての sqlstate_value 値をキャプチャし、EXIT 操作を実行して「CAN NOT FIND」情報を出力します。 6 番目の方法は、SQLEXCEPTION を使用することです。 SQLEXCEPTION は、SQLWARNING または NOT FOUND によってキャプチャされなかったすべての sqlstate_value 値をキャプチャし、EXIT 操作を実行して「ERROR」情報を出力します。
この記事をお読みいただきありがとうございます。皆様のお役に立てれば幸いです。このサイトのご支援に感謝いたします。