Bagaimana untuk mencipta prosedur dan fungsi tersimpan MySQL

王林
Lepaskan: 2023-06-03 09:22:42
ke hadapan
1830 orang telah melayarinya

1.0 Cipta prosedur dan fungsi tersimpan

Mencipta prosedur dan fungsi tersimpan adalah untuk menggabungkan satu set pernyataan SQL yang kerap digunakan bersama-sama dan menyimpan pernyataan SQL ini secara keseluruhan dalam pelayan MySQL

1 . Cipta prosedur tersimpan

CREATE PROCEDURE procedure_name ([proc_param[,...]])
    [characteristic ...] routine_body
Salin selepas log masuk
  • procedure_name mewakili nama prosedur tersimpan yang akan dibuat

  • proc_param mewakili parameter prosedur tersimpan

  • ciri mewakili ciri prosedur tersimpan

  • rutin_body mewakili pernyataan SQL prosedur tersimpan

procedure_name tidak boleh diulang Bentuk sintaks setiap parameter dalam

proc_param adalah seperti berikut Setiap parameter terdiri daripada tiga bahagian iaitu jenis input/output, nama parameter dan jenis parameter. Terdapat tiga jenis input dan output iaitu IN, OUT, dan INOUT. param_name mewakili nama parameter, jenis mewakili jenis parameter

[ IN | OUT | INOUT ] param_name type
Salin selepas log masuk

ciri menentukan ciri prosedur tersimpan dan mempunyai nilai berikut:

  • BAHASA SQL: menunjukkan bahawa prosedur tersimpan digunakan

  • [TIDAK] ditulis dalam bahasa SQL DETERMINISTIC: Menunjukkan sama ada keputusan pelaksanaan prosedur tersimpan adalah betul menunjukkan bahawa keputusan adalah pasti, iaitu setiap apabila prosedur tersimpan dilaksanakan, input yang sama akan mendapat hasil yang sama

    {CONTAINS SQL |. NO SQL |. MEMBACA DATA SQL | menunjukkan bahawa subprogram tidak mengandungi SQL READS SQL DATA menunjukkan bahawa subprogram mengandungi pernyataan untuk membaca data, tetapi tidak termasuk Penyata untuk menulis data, MENGUBAH SUAI DATA SQL bermakna subrutin mengandungi pernyataan untuk menulis data
  • <. 🎜>

    SQL SECURITY {DEFINER |.

  • ULASAN 'rentetan': maklumat ulasan, yang boleh digunakan untuk menerangkan prosedur atau fungsi yang disimpan
  • Contoh: Buat prosedur tersimpan untuk menanyakan gaji semua pekerja dalam jadual t_employee
  • DELIMITER $$
    CREATE PROCEDURE proc_employee()
    COMMENT &#39;查询员工薪水&#39;
    BEGIN
    	SELECT salary FROM t_employee
    END;
    $$
    DELIMITER ;
    Salin selepas log masuk

    MySQL menggunakan koma bertitik secara lalai sebagai penamat pernyataan, pernyataan SQL dalam prosedur tersimpan perlu diakhiri dengan koma bertitik , untuk mengelakkan konflik, gunakan DELIMITER $$ dahulu untuk menetapkan akhir aksara MySQL kepada $$, dan kemudian gunakan DELIMITER ; untuk memulihkan aksara akhir kepada koma bertitik

  • 2 Cipta fungsi tersimpan
CREATE FUNCTION fun_name([func_param,[,...]])
	[characteristic ...] routine_body
Salin selepas log masuk

fun_name mewakili fungsi. nama

    func_param mewakili parameter fungsi
  • ciri mewakili ciri fungsi, nilai dan prosedur tersimpan Nilai adalah sama
  • routine_body mewakili pernyataan SQL bagi fungsi
  • Bentuk sintaks setiap parameter dalam func_param adalah seperti berikut, iaitu nama parameter dan jenis parameter
  • param_type type

Masih contoh sebelumnya

DELIMITER $$
	CREATE FUNCTION func_employee(id INT(4))
		RETURNS INT(6)
	COMMENT &#39;查询员工薪水&#39;
	BEGIN
		SELECT salary FROM t_employee
	END;
	$$
DELIMITER ;
Salin selepas log masuk
2|0 pembolehubah

Dalam MySQL, anda boleh mentakrifkan dan menggunakan pembolehubah , ini Skop pembolehubah adalah di bahagian BEGIN ... END program

1 Tentukan pembolehubah

DECLARE var_name[,...] type [DEFAULT value]
Salin selepas log masuk

Kata kunci DECLARE digunakan untuk mengisytiharkan pembolehubah

.

    Parameter var_name ialah nama pembolehubah berbilang boleh ditakrifkan pada masa yang sama
  • Jenis parameter digunakan untuk menentukan jenis. pembolehubah
  • Klausa nilai DEFAULT menetapkan nilai lalai pembolehubah kepada nilai Apabila klausa DEFAULT tidak digunakan, nilai lalai ialah NULL
  • .
  • Contoh: Tentukan pembolehubah sql_test, jenis data ialah INT, dan nilai lalai ialah 10
  • DECLARE test_sql INT DEFAULT 10;
    Salin selepas log masuk

    2 Pembolehubah tugasan

    SET var_name=expr[,var_name=expr]...
    Salin selepas log masuk

Kata kunci SET ialah. digunakan untuk memberikan nilai kepada pembolehubah

    Parameter var_name ialah pembolehubah Nama
  • parameter expr ialah ungkapan tugasan
  • < . ditemui semasa pelaksanaan program, dan keupayaan untuk menyelesaikan masalah ini boleh ditakrifkan dalam pengendali

    1. Tentukan syarat
  • SET test_sql = 30;
    Salin selepas log masuk
  • Nama_syarat parameter mewakili nama syarat

Parameter condition_value mewakili jenis syarat

Parameter sqlstate_value dan Parameter mysql_error_code boleh mewakili ralat MySQL

  • Contoh: Takrifkan ralat ERROR 1146 (42S02), dinamakan can_not_find, yang boleh ditakrifkan dalam dua cara berbeza

    DECLARE condition_name CONDITION FOR condition_value
    condition_value:
    SQLSTATE[VALUE] sqlstate_value|mysql_error_code
    Salin selepas log masuk

    2. Takrifkan pengendali
  • // 方法一:使用sqlstate_value
    DECLARE can_not_find CONDITION FOR SQLSTATE &#39;42S02&#39;;
    // 方法二:使用mysql_error_code
    DECLARE can_not_find CONDITION FOR 1146;
    Salin selepas log masuk
  • jenis_pengendali menunjukkan kaedah pengendalian ralat: parameter ini mempunyai tiga nilai:
  • TERUSKAN: bermakna Jika ralat ditemui, jangan kendalikannya dan teruskan laksanakan

KELUAR: Menunjukkan bahawa anda akan keluar serta-merta jika anda menghadapi ralat

  • BUTUH: Menunjukkan bahawa anda akan menarik diri selepas menghadapi ralat sebelum ini 🎜>

    • condition_value mewakili jenis ralat, yang boleh mempunyai nilai berikut:
    • SQLSTATE[VALUE]sqlstate_value mengandungi ralat rentetan 5 aksara nilai

    • condition_name mewakili nama keadaan ralat yang ditakrifkan oleh DECLARE CONDITION

    • SQLWARNING 匹配所有 01 开头的 SQLSTATE 错误代码

    • NOT FOUND 匹配所有 02 开头的 SQLSTATE 错误代码

    • SQLEXCEPTION 匹配所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE 错误代码

    • mysql_error_code 匹配数值类型错误代码

  • proc_statement 匹配数值类型错误代码

下面是定义处理程序的几种示例方式:

// 方法一:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE &#39;42S02&#39;
SET @info=&#39;NOT FOUND&#39;;
// 方法二:使用mysql_error_code 
DECLARE CONTINUE HANDLER FOR 1146
SET @info=&#39;NOT FOUND&#39;;
// 方法三:先定义条件,然后调用
ECLARE can_not_find CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR can_not_find
SET @info=&#39;NOT FOUND&#39;;
// 方法四:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING 
SET @info=&#39;ERROR&#39;;
// 方法五:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND
SET @info=&#39;NOT FOUND&#39;;
// 方法六:使用SQLEXCEPTION 
DECLARE EXIT HANDLER FOR 使用SQLEXCEPTION
SET @info=&#39;ERROR&#39;;
Salin selepas log masuk

4|0光标

在存储过程和函数中,可以使用光标逐条读取查询结果集中可能出现的多条记录。光标必须声明在处理程序之前,声明在变量和条件之后

1. 声明光标

DECLARE cursor_name CURSOR
FOR select_statement;
Salin selepas log masuk
  • 参数 cursor_name 表示光标名称

  • 参数 select_statement 表示 SELECT 语句

下面声明一个名为 cur_employee 的光标

DECLARE cur_employee CURSOR
FOR SELECT name,age FROM t_employee;
Salin selepas log masuk

2. 打开光标

OPEN cursor_name;
Salin selepas log masuk
  • 参数 cursor_name 表示光标的名称

下面打开一个名为 cur_employee 的光标

OPEN cur_employee;
Salin selepas log masuk

3. 使用光标

FETCH cursor_name
INTO var_name[,var_name...]
Salin selepas log masuk
  • cursor_name 表示光标的名称

  • var_name 表示将光标中的 SELECT 语句查询出来的信息存入该参数,该参数必须在声明光标之前就定义好

下面打开一个名为 cur_employee 的光标,将查询的数据存入 emp_name 和 emp_age 这两个变量中

FETCH cur_employee INTO emp_name,emp_age;
Salin selepas log masuk

4. 关闭光标

CLOSE cursor_name
Salin selepas log masuk
  • cursor_name 表示光标的名称

5|0流程控制

1. IF 语句

IF search_condition THEN statement_list
 [ELSEIF search_condition THEN statement_list]...
 [ELSE statement_list]
END IF
Salin selepas log masuk
  • 参数 search_condition 表示条件判断语句

  • 参数 statement_list 表示不同条件的执行语句

下面是一个 IF 语句的示例

IF age>20 THEN SET @count1=@conut1+1;
	ELSEIF age=20 THEN @count2=@conut2+1;
	ELSE @count3=@count3+1;
END IF;
Salin selepas log masuk

2. CASE 语句

CASE case_value
	WHEN when_value THEN statement_list
	[WHEN when_value THEN statement_list]...
	[ELSE statement_list]
END CASE
Salin selepas log masuk
  • 参数 case_value 表示条件判断的变量

  • 参数 when_value 表示变量的取值

  • 参数 statement_list 表示不同 when_value 的执行语句

下面的是一个 CASE 语句的示例

CASE age
	WHEN 20 THEN SET @count1=@count1+1;
	ELSE SET @count2=@count2+1;
END CASE;
Salin selepas log masuk

3. LOOP 语句

[begin_label:]LOOP
	statement_list
END LOOP [end_label]
Salin selepas log masuk
  • 参数 begin_label 和参数 end_label 分别表示循环开始和结束的标志,必须相同,而且都可以省略

  • 参数 statement_list 表示需要循环执行的语句

下面是一个 LOOP 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
END LOOP add_num
Salin selepas log masuk

4. LEAVE 语句

主要用于跳出循环

LEAVE label
Salin selepas log masuk
  • 参数 label 表示循环的标志

下面是一个 LEAVE 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
	IF @count1=100 THEN
		LEAVE add_num;
END LOOP add_num
Salin selepas log masuk

5. ITERATE 语句

也是用于跳出循环,不过是跳出本次循环,直接进入下次循环,类似 Java 的 continue

ITERATE label
Salin selepas log masuk

ITERATE label

  • 参数 label 表示循环的标志

下面是一个 ITERATE 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
	IF @count1=100 THEN
		LEAVE add_num;
	ELSE IF MOD(@count1,3)=0 THEN
		ITERATE add_num;
	SELECT * FROM employee;
END LOOP add_num
Salin selepas log masuk

6. REPEAT 语句

REPEAT 语句是由条件的控制循环语句,当满足特定条件就会退出循环语句

[begin_label:]REPEAT
	statement_list
	UNTIL search_condition
END REPEAT [end_label]
Salin selepas log masuk
  • 参数 statement_list 表示需要循环执行的语句

  • 参数 search_condition 表示结束循环的条件,满足该条件即结束循环

下面是一个 REPEAT 语句的示例

add_num:REPEAT
	SELECT @count1=@count1+1;
	UNTIL @count1=100
END REPEAT add_num
Salin selepas log masuk

7. WHILE 语句

WHILE 语句也是有条件控制的循环语句,与 REPEAT 语句不同的是,WHILE 语句是当满足条件时执行循环内的语句

[begin_label:]WHILE search_condition DO
	statement_list
END WHILE [end_label]
Salin selepas log masuk
  • 参数 statement_list 表示需要循环执行的语句

  • 参数 search_condition 表示结束循环的条件,满足该条件即结束循环

下面是一个 WHILE 语句的示例

WHILE @count<100 DO
	SET @count=@count+1;
END WHILE;
Salin selepas log masuk

6|0操作存储过程和函数

1. 调用存储过程

在 MySQL 中,使用 CALL 语句来调用存储过程

CALL proc_name([parameter[,...]])
Salin selepas log masuk
  • proc_name 是存储过程的名称

  • paramter 是指存储过程的参数

2. 调用存储函数

在 MySQL 中,存储函数的使用方法和 MySQL 内部函数是一样的

3. 使用 SHOW STATUS 语句查看存储过程和函数的状态

SHOW {PROCEDURE|FUNCTION} STATUS{LIKE &#39;pattern&#39;}
Salin selepas log masuk
  • 参数 PROCEDURE 表示查询存储过程,FUNCTION 表示存储函数

  • 参数 LIKE 'pattern' 用来匹配存储过程或函数的名称

4. 使用 SHOW CREATE 语句查看存储过程和函数的定义

SHOW CREATE {PROCEDURE|FUNCTION} proc_name
Salin selepas log masuk

5. 从 information_schema.Routine 表中查看存储过程和函数的信息

SELECT * FROM information_schema.Routine
WHERE ROUTINE_NAME=&#39;proc_name&#39;
Salin selepas log masuk

6. 修改存储过程和函数

ALTER {PROCEDURE|FUNCTION} proc_name[characteristic...];
characteristic:
	{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
|COMMENT &#39;string&#39;
Salin selepas log masuk
  • 参数 proc_name 表示存储过程或函数的名称

  • 参数 characteristic 指定存储过程的特性:

    • CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句

    • NO SQL 表示子程序不包含 SQL 语句

    • READS SQL DATA 表示子程序中包含读数据的语句

    • MODIFIES SQL DATA 表示子程序中包含写数据的语句

  • SQL SECURITY{DEFINER|INVOKER} 指明谁有权限执行:

    • DEFINER 表示只有定义者才能执行

    • INVOKER 表示调用者可以执行

  • COMMENT 'string' 是注释信息

7. 删除存储过程和函数

通过 DROP 语句删除存储过程

DROP PROCEDURE proc_name;
Salin selepas log masuk

通过 DROP FUNCTION 语句删除存储函数

DROP FUNCTION func_name;
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mencipta prosedur dan fungsi tersimpan MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan