Heim  >  Artikel  >  Datenbank  >  [MySQL 08] Gespeicherte Prozedur

[MySQL 08] Gespeicherte Prozedur

黄舟
黄舟Original
2017-02-04 13:17:581577Durchsuche

Erstens ähnelt es bei gespeicherten SQL-Prozeduren der Definitionsmethode und der Aufrufmethode in Java.

1. Erstellen Sie eine gespeicherte Prozedur

In MySQL ist die Grundform einer gespeicherten Prozedur:

CREATE PROCEDURE sp_name ([proc_parameter[,...]])  
        [characteristic ...] routine_body
  • Der sp_name-Parameter ist der Name der gespeicherten Prozedur;

  • proc_parameter stellt die Parameterliste der gespeicherten Prozedur dar;

  • charakteristischer Parameter gibt die Eigenschaften der gespeicherten Prozedur an

  • routine_body ist der Inhalt des SQL-Codes. Mit BEGIN...END können Sie den Anfang und das Ende des SQL-Codes markieren.

  • Jeder Parameter in proc_parameter besteht aus 3 Teilen. Diese drei Teile sind Eingabe- und Ausgabetypen, Parameternamen und Parametertypen. Seine Form ist wie folgt:

[ IN | OUT | INOUT ] param_name type
  • IN stellt Eingabeparameter dar;

  • OUT stellt Ausgabeparameter dar; 🎜>

  • INOUT bedeutet, dass es sich entweder um eine Eingabe oder um eine Ausgabe handeln kann.
  • param_name-Parameter ist der Parametername der gespeicherten Prozedur
  • Der Typparameter gibt den Parametertyp der gespeicherten Prozedur an, der ein beliebiger Datentyp der MySQL-Datenbank sein kann
  • Vereinfachte Definition:

Aufruf:
create procedure 过程名(参数...)
begin
    SQL语句...end

Hinweis:
call 过程名(实参)
Vor der Definition müssen Sie die Standardanweisung mit der Endung „;“ in etwas anderes ändern, z Das Verfahren wird nicht ausgeführt. Behandeln Sie es als Ende der Anweisung (andernfalls wird es direkt übermittelt). Nachdem Sie es definiert haben, müssen Sie „;“ auf das Standardabschlusszeichen zurücksetzen.


2. Gespeicherte Prozeduren ohne Parameter

3. Gespeicherte Prozeduren mit Parametern
//建立存储过程mysql> delimiter %%
mysql> create procedure p1()    
-> begin    
-> select Sname,Ssex from student;    
-> end %%mysql> delimiter ;  
//调用存储过程mysql> call p1(); 
+--------+------+| Sname  | Ssex |
+--------+------+| 赵英    | 女   |
| 郑美丽  | 女   |
| 李哲    | 男   |
| 王洋    | 女   |
| 王平    | 男   |
| 赵东新  | 男   |
| 王新    | 男   |
| 陶丽平  | 男   |
| 陈文    | 女   |
| 蔡天    | 女   || 杨洋    | 男   |
+--------+------+

4. Gespeicherte Prozeduren mit Rückgabewerten
//查询mysql> select * from employee;
+------------+------------+------------+--------------+| employeeID | name       | job        | departmentID |
+------------+------------+------------+--------------+| 6651       | Ajay Patel | Programmer |          128 |
| 7513       | Nora Edwar | Programmer |          128 |
| 9006       | Candy Burn | Systems Ad |          128 |
| 9842       | Ben Smith  | DBA        |           42 |
| 9843       | Pert Park  | DBA        |           42 |
| 9845       | Ben Patel  | DBA        |          128 |
| 9846       | Red Right  | NULL       |          128 |
| 9847       | Run Wild   | NULL       |          128 |
| 9848       | Rip This J | NULL       |          128 |
| 9849       | Rip This J | NULL       |          128 |
| 9850       | Reader U   | NULL       |          128 || 6651       | Ajay Patel | Programmer |          128 |
+------------+------------+------------+--------------+//建立存储过程mysql> delimiter &&
mysql> create procedure p4(in employeeID char(4),in name varchar(20),in job varchar(20),in departmentID int(11))    -> begin    
-> insert into employee value(employeeID,name,job,departmentID);    -> select * from employee;    -> end &&mysql> delimiter ;  
//调用存储过程mysql> call p4('7322','cid','udewhuuwdwq',127);
+------------+------------+-------------+--------------+| employeeID | name       | job         | departmentID |
+------------+------------+-------------+--------------+| 6651       | Ajay Patel | Programmer  |          128 |
| 7513       | Nora Edwar | Programmer  |          128 |
| 9006       | Candy Burn | Systems Ad  |          128 |
| 9842       | Ben Smith  | DBA         |           42 |
| 9843       | Pert Park  | DBA         |           42 |
| 9845       | Ben Patel  | DBA         |          128 |
| 9846       | Red Right  | NULL        |          128 |
| 9847       | Run Wild   | NULL        |          128 |
| 9848       | Rip This J | NULL        |          128 |
| 9849       | Rip This J | NULL        |          128 |
| 9850       | Reader U   | NULL        |          128 |
| 6651       | Ajay Patel | Programmer  |          128 || 7322       | cid        | udewhuuwdwq |          127 |
+------------+------------+-------------+--------------+

//建立存储过程mysql> delimiter &&
mysql> create procedure p9(in employeeID char(4),in name varchar(20),in job varchar(20),in departmentID int(11),out num int)
    -> begin
    -> insert into employee value(employeeID,name,job,departmentID);
    -> select count(*) into num from employee;
    -> end &&

mysql> delimiter ; 

//调用存储过程mysql> call p9('3632','dueh','xianggang',28,@num);//注意输出变量的输出mysql> select @num;
+------+
| @num |
+------+
|   15 |
+------+//////////////////////////系统变量名称:@@变量名/// //用户变量名称:@变量名 ///


5. Verwendung von Variablen

In gespeicherten Prozeduren und Funktionen können Variablen definiert und verwendet werden. Benutzer können das Schlüsselwort DECLARE verwenden, um Variablen zu definieren. Anschließend kann der Variablen ein Wert zugewiesen werden. Der Gültigkeitsbereich dieser Variablen liegt im Programmabschnitt BEGIN...END. In diesem Abschnitt wird erläutert, wie Sie Variablen definieren und Variablen Werte zuweisen.

1. Variablen definieren

Sie können das Schlüsselwort DECLARE verwenden, um Variablen in MySQL zu definieren. Die grundlegende Syntax zum Definieren von Variablen lautet wie folgt:

Unter anderem wird das Schlüsselwort DECLARE zum Deklarieren von Variablen verwendet. Der Parameter var_name ist der Name der Variablen, wobei mehrere Variablen gleichzeitig definiert werden können time; der Typparameter wird verwendet, um den Variablentyp anzugeben; die DEFAULT-Wertklausel setzt den Standardwert der Variablen auf value.
DECLARE var_name[,...] type [DEFAULT value]

2. Variablen Werte zuweisen
DECLARE  my_sql  INT  DEFAULT 10 ; //定义变量my_sql,数据类型为INT型,默认值为10

Sie können das SET-Schlüsselwort in MySQL verwenden, um Variablen Werte zuzuweisen. Die grundlegende Syntax der SET-Anweisung lautet wie folgt:

Unter anderem wird das Schlüsselwort SET verwendet, um einer Variablen einen Wert zuzuweisen; der Parameter expr ist der Name der Variablen ein Zuweisungsausdruck. Eine SET-Anweisung kann mehreren Variablen gleichzeitig Werte zuweisen. Die Zuweisungsanweisungen für jede Variable werden durch Kommas getrennt.
SET var_name = expr[,var_name = expr] ...

Sie können auch die SELECT...INTO-Anweisung verwenden, um Variablen in MySQL Werte zuzuweisen. Die grundlegende Syntax lautet wie folgt:
SET my_sql = 30 ; //为变量my_sql赋值为30

SELECT col_name[,…] INTO var_name[,…]

FROM table_name WEHRE-Bedingung

Unter anderem stellt der Parameter col_name den Namen des Abfragefelds dar; ist der Name der Variablen; der Parameter „table_name“ bezieht sich auf den Namen der Tabelle; der Parameter „condition“ bezieht sich auf die Abfragebedingung.

6. Definieren Sie Bedingungen und Handler
SELECT d_id INTO my_sql  
   FROM employee WEHRE id=2 ; //从employee表中查询id为2的记录,将该记录的d_id值赋给变量my_sql

Das Definieren von Bedingungen und Handlern dient dazu, im Voraus die Probleme zu definieren, die während der Programmausführung auftreten können. Und Lösungen für diese Probleme können im Handler definiert werden. Dieser Ansatz kann mögliche Probleme im Voraus vorhersagen und Lösungen vorschlagen. Dies kann die Fähigkeit des Programms, Probleme zu bewältigen, verbessern und verhindern, dass das Programm abnormal stoppt. In MySQL werden Bedingungen und Handler über das Schlüsselwort DECLARE definiert. In diesem Abschnitt wird ausführlich erläutert, wie Bedingungen und Handler definiert werden.

1. Bedingungen definieren

Sie können das Schlüsselwort DECLARE verwenden, um Bedingungen in MySQL zu definieren. Die grundlegende Syntax lautet wie folgt:

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。

//定义"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表示一些存储过程或函数的执行语句。

//定义处理程序的几种方式
//方法一:捕获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';
  • 第一种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为42S02,执行CONTINUE操作,并且输出”CANNOT FIND”信息。

  • 第二种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并且输出”CAN NOT FIND”信息。

  • 第三种方法是先定义条件,然后再调用条件。这里先定义can_not_find条件,遇到1146错误就执行CONTINUE操作。

  • 第四种方法是使用SQLWARNING。SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出”ERROR”信息。

  • 第五种方法是使用NOT FOUND。NOT FOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出”CAN NOT FIND”信息。

  • 第六种方法是使用SQLEXCEPTION。SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出”ERROR”信息。

以上就是 【MySQL 08】存储过程的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn