ホームページ  >  記事  >  データベース  >  mysqlストアドプロシージャの詳しい解説_MySQL

mysqlストアドプロシージャの詳しい解説_MySQL

WBOY
WBOYオリジナル
2016-11-30 23:59:401079ブラウズ

mysql/>MySQL ストアド プロシージャ

14.1.1 ストアドプロシージャの作成

MySQL では、ストアド プロシージャを作成する基本的な形式は次のとおりです:

プロシージャの作成 sp_name ([proc_parameter[,...]])
[特徴 ...] ルーチンボディ

このうち、sp_name パラメータはストアド プロシージャの名前、proc_parameter はストアド プロシージャのパラメータ リストを表し、characteristic パラメータはストアド プロシージャの特性を指定します。 ..END は、SQL コードの開始と終了をマークするために使用できます。

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[,…] 
    FROM  table_name  WEHRE  condition

其中,col_name参数表示查询的字段名称;var_name参数是变量的名称;table_name参数指表的名称;condition参数指查询条件。

【示例14-5】 下面从employee表中查询id为2的记录,将该记录的d_id值赋给变量my_sql。代码如下:

SELECT  d_id  INTO  my_sql 
        FROM  employee  WEHRE  id=2 ; 

14.1.4  定义条件和处理程序

定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。本小节中将详细讲解如何定义条件和处理程序。

1.定义条件

MySQL中可以使用DECLARE关键字来定义条件。其基本语法如下:

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」情報を出力します。

この記事をお読みいただきありがとうございます。皆様のお役に立てれば幸いです。このサイトのご支援に感謝いたします。

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