ストアドプロシージャとは何ですか?
これは、操作の集合であるC言語の関数として理解できます。この関数を呼び出すだけで、複数のステートメントの機能を実現できます
ストアドプロシージャと関数は、データベースで定義されたいくつかのSQLステートメントのコレクションであり、これらのストアドプロシージャと関数を直接呼び出して、定義されたSQLステートメントを実行します。ストアドプロシージャと関数は、開発者が同じSQLステートメントを繰り返し作成することを防ぐことができます。さらに、ストアドプロシージャと関数はMySQLサーバーに保存および実行されるため、クライアントとサーバー間のデータ転送を減らすことができます。
ストアドプロシージャを作成する
ストアドプロシージャと関数の作成とは、頻繁に使用される一連のSQLステートメントを組み合わせて、これらのSQLステートメント全体をMySQLサーバーに格納することを指します。ストアドプロシージャは、ストアドプロシージャと関数に分けることができます。MySQLでストアドプロシージャを作成するために使用されるステートメントCREATE PROCEDURE。文法は次のとおりです。
CREATE PROCEDURE procedure_name([proc_param [、…]])
routine_body
上記のステートメントで、パラメーターprocedure_nameは作成するストアード・プロシージャーの名前を示し、パラメーターproc_paramはストアード・プロシージャーのパラメーターを示し、パラメーターroutine_bodyはストアード・プロシージャーのSQLステートメント・コードを示します。BEGIN... ENDを使用して、SQLステートメントの開始と終了をマークできます。
ヒント: ストアドプロシージャを作成する場合、ストアドプロシージャの名前を既存のストアドプロシージャの名前と同じにすることはできません。実際の戦闘では、ストアドプロシージャの名前をprocedure_xxxまたはproc_xxxにすることをお勧めします。
proc_paramの各パラメータの構文形式は次のとおりです。
[IN | OUT | INOUT] param_nameタイプ
上記のステートメントでは、各パラメーターは3つの部分(入出力タイプ、パラメーター名、パラメータータイプ)で構成されています。その中に、入出力タイプには、IN(入力タイプを表す)、OUT(出力タイプを表す)、およびINOUT(入出力タイプを表す)の3つのタイプがあります。param_nameはパラメーター名を表し、typeはパラメータータイプを表します。これは、MySQLソフトウェアでサポートされている任意のデータタイプです。
【デモ】
mysql> use school; #データベーススクールを選択 mysql> 区切り文字$$ mysql> プロシージャの作成proc_delete_student(IN sid int) ベギン deide cid int; #define variable cid 学生からclass_idをcidに選択しますid = sid;#クエリステートメントで変数を設定 等級から削除id = sid;#成績表のレコードを 削除 id = sidの生徒から削除します;#生徒テーブルのレコードを削除し ます update class set count = count-1 where id = cid;#クラステーブルのレコードを更新 終わり; $$ 区切り文字; mysql> call proc_delete_student(2);#ストアドプロシージャを呼び出す |
- ストアドプロシージャで変数を使用する
ストアドプロシージャと関数では、変数を定義して使用できます。ユーザーはキーワードDECLAREを使用して変数を定義し、変数に値を割り当てることができます。これらの変数のスコープはBEGIN ... ENDブロックにあります。
1.変数を定義する
MySQLでは、DECLAREキーワードを使用して変数を定義できます。変数を定義するための基本的な構文は次のとおりです。
DECLARE var_name [、…]タイプ[デフォルト値]
それらの中で、キーワードDECLAREは変数の宣言に使用されます。パラメーターvar_nameは変数の名前であり、同時に複数の変数を定義できます。パラメータータイプは変数のタイプを指定するために使用されます。DEFAULT値句は、DEFAULTを使用せずに変数のデフォルト値を値に設定します句、デフォルト値はNULLです。
変数cidを定義します。データタイプはINTで、デフォルト値は10です。コードは次のとおりです。
DECLARE cid INT DEFAULT 10;
2.変数に値を割り当てる
MySQLでは、キーワードSETを使用して変数に値を割り当てることができます。SETステートメントの基本的な構文は次のとおりです。
SET var_name = expr [、var_name = expr]…
このうち、キーワードSETは変数に値を割り当てるために使用されます。パラメーターvar_nameは変数の名前、パラメーターexprは割り当て式です。SETステートメントは同時に複数の変数に値を割り当てることができ、各変数の割り当てステートメントはコンマで区切られます。
たとえば、変数tmp_id を88 に割り当てるには、コードは次のようになります。
SET t mp _ id = 88 ;
MySQLでは、SELECT ... INTOステートメントを使用して変数に値を割り当てることもできます。基本的な構文は次のとおりです。
SELECT col_name [、…] INTO var_name [、…]
FROM table_name WHERE条件
このうち、パラメーターcol_nameはクエリフィールドの名前を表し、パラメーターvar_nameは変数の名前、パラメーターtable_nameはテーブルの名前、パラメーター条件はクエリ条件を表します。
[デモ]従業員テーブルからID 3のレコードをクエリし、レコードのID値を変数tmp_idに割り当てます。コードは次のとおりです。
SELECT ID INTO tmp_id
FROM グレード WEHRE id = sid ;
mysql> use school; #データベーススクールを選択 mysql> 存在する 場合は、 PROCEDUREを削除しますquery_student_class_info; mysql> 区切り文字$$ mysql> create query_student_class_info(IN sid int、OUT cname varchar(128)、OUT ccount int) ベギン tmp_name varchar(128)を宣言します。 tmp_count intを宣言します。 tmp_cid intを宣言します。 学生からtmp_cidへのclass_idを選択します。id= sid; 名前を選択し、クラスからtmp_name、tmp_countにカウントします。ここでid = tmp_cid; cname = tmp_name、ccount = tmp_countを設定します。 終わり; $$ 区切り文字; mysql> call query_student_class_info(4, @name, @count); #调用存储过程 mysql> select @name, @count; |
- 光标的使用
查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。有些书上将光标称为游标。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。
1. 声明光标
在MySQL中,可以使用DECLARE关键字来声明光标,其基本语法如下:
DECLARE cursor_name CURSOR
FOR select_statement;
其中,参数cursor_name表示光标的名称;参数select_statement表示SELECT语句的内容。
【demo】下面声明一个名为cur_student的光标,代码如下:
mysql> use school; #选择数据库school mysql> DELIMITER $$ mysql> create procedure query_student (IN sid int, OUT cname varchar(128), OUT class_id int ) BEGIN DECLARE cur_student CURSOR FOR SELECT name, class_id FROM student; END; $$ DELIMITER ; |
在上面的示例中,光标的名称为cur_student;SELECT语句部分是从表student中查询出字段name和class_id的值。
2. 打开光标
在MySQL中,使用关键字OPEN来打开光标,其基本语法如下:
OPEN cursor_name;
其中,参数cursor_name表示光标的名称。
下面代码打开一个名为cur_student的光标,代码如下:
OPEN cur_student;
3. 使用光标
在MySQL中,使用关键字FETCH来使用光标,其基本语法如下:
FETCH cursor_name
INTO var_name[,var_name…];
其中,参数cursor_name表示光标的名称;参数var_name表示将光标中的SELECT语句查询出来的信息存入该参数中。var_name必须在声明光标之前就定义好。
【demo】下面声明一个名为cur_student的光标,代码如下:
mysql> use school; #选择数据库school mysql> DELIMITER $$ mysql> create procedure query_student (IN sid int, OUT cname varchar(128), OUT cid int) BEGIN declare tmp_name varchar(128); #必须定义在声明光标之前 declare tmp_cid int; declare done int default 0; declare cur_student CURSOR FOR SELECT name, class_id FROM student where id = sid; declare continue handler for not found set done = 1; #将结束标志绑定到游标上 open cur_student; select done; fetch cur_student into tmp_name, tmp_cid; select done; select tmp_name, tmp_cid; #打印从光标中获取到的值 close cur_student; set cname = tmp_name, cid = tmp_cid; END; mysql> $$ mysql> DELIMITER ; |
4. 关闭光标
在MySQL中,使用关键字CLOSE来关闭光标,其基本语法如下:
CLOSE cursor_name;
其中,参数cursor_name表示光标的名称。
例如: 关闭一个名为cur_student的光标,代码如下:
CLOSE cur_student;
在上面的示例中,关闭了这个名称为cur_student的光标。关闭了之后就不能使用FETCH来使用光标了。提示
如果存储过程或函数中执行了SELECT语句,并且SELECT语句会查询出多条记录,这种情况最好使用光标来逐条读取记录,光标必须在处理程序之前且在变量和条件之后声明,而且光标使用完毕后一定要关闭。