ストアドプロシージャとカーソルの使用-MySQL

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

 

これは、操作の集合である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);#ストアドプロシージャを呼び出す                                                               

  1. ストアドプロシージャで変数を使用する

ストアドプロシージャと関数では、変数を定義して使用できます。ユーザーはキーワード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. 光标的使用

查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。有些书上将光标称为游标。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。

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语句会查询出多条记录,这种情况最好使用光标来逐条读取记录,光标必须在处理程序之前且在变量和条件之后声明,而且光标使用完毕后一定要关闭。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_44065088/article/details/107351389