Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk memanggil prosedur tersimpan MySQL

Bagaimana untuk memanggil prosedur tersimpan MySQL

王林
王林ke hadapan
2023-05-27 23:39:075632semak imbas

Ikhtisar

Prosedur tersimpan disokong bermula dari MySQL versi 5.0.

Jika anda perlu menulis set pernyataan SQL yang kompleks untuk mencapai keperluan pengguna tertentu, maka kami boleh menulis set pernyataan SQL yang kompleks ini dalam pangkalan data terlebih dahulu dan memanggilnya melalui JDBC untuk melaksanakan set pernyataan SQL ini . Set pernyataan SQL yang ditulis dalam pangkalan data dipanggil prosedur tersimpan.

Prosedur tersimpan : (PROSEDUR) ialah koleksi pernyataan SQL yang telah disusun terlebih dahulu dan disimpan dalam pangkalan data. Memanggil prosedur tersimpan boleh memudahkan banyak kerja untuk pembangun aplikasi, mengurangkan penghantaran data antara pangkalan data dan pelayan aplikasi, dan sangat bermanfaat untuk meningkatkan kecekapan pemprosesan data.

ialah enkapsulasi kod dan penggunaan semula pada peringkat bahasa SQL pangkalan data.

Sama seperti kaedah dalam Java, prosedur tersimpan perlu ditakrifkan terlebih dahulu dan dipanggil apabila digunakan. Parameter boleh ditakrifkan dalam prosedur tersimpan Parameter ini dibahagikan kepada tiga jenis: IN, OUT dan INOUT.

  • Parameter jenis IN mewakili penerimaan data yang dihantar masuk oleh pemanggil; 🎜>

  • Parameter jenis INOUT boleh menerima parameter yang diluluskan oleh pemanggil dan juga boleh mengembalikan data kepada pemanggil.
  • Kelebihan
  • Prosedur tersimpan terkandung dalam unit yang mudah digunakan melalui pemprosesan, memudahkan operasi yang kompleks.

    Memudahkan pengurusan perubahan. Jika nama jadual, nama lajur atau logik perniagaan berubah. Hanya kod prosedur yang disimpan perlu diubah. Orang yang menggunakannya tidak perlu menukar kod mereka.
  1. Prosedur yang biasanya disimpan membantu meningkatkan prestasi aplikasi. Apabila prosedur tersimpan yang dibuat disusun, ia disimpan dalam pangkalan data.
  2. Walau bagaimanapun, prosedur tersimpan yang dilaksanakan oleh MySQL sedikit berbeza.

    Prosedur tersimpan MySQL disusun atas permintaan. Selepas menyusun prosedur tersimpan, MySQL meletakkannya dalam cache.

    MySQL mengekalkan cache prosedur tersimpannya sendiri untuk setiap sambungan. Jika aplikasi menggunakan prosedur tersimpan berbilang kali dalam satu sambungan, gunakan versi terkumpul, jika tidak, prosedur tersimpan berfungsi seperti pertanyaan.

  3. Prosedur tersimpan membantu mengurangkan trafik antara aplikasi dan pelayan pangkalan data.
    Oleh kerana aplikasi tidak perlu menghantar berbilang penyata SQL yang panjang, ia hanya perlu menghantar nama dan parameter prosedur yang disimpan.

  4. Prosedur tersimpan boleh diguna semula dan telus untuk sebarang aplikasi. Untuk menyelamatkan pembangun daripada menduplikasi kefungsian yang sudah disokong, prosedur tersimpan mendedahkan antara muka pangkalan data kepada semua aplikasi.


  5. Program yang disimpan adalah selamat. Pentadbir pangkalan data boleh memberikan kebenaran yang sesuai kepada aplikasi yang mengakses prosedur tersimpan dalam pangkalan data tanpa memberikan sebarang kebenaran kepada jadual pangkalan data asas.
  6. Kelemahan
  7. Jika sejumlah besar prosedur tersimpan digunakan, penggunaan memori setiap sambungan menggunakan prosedur tersimpan ini akan meningkat dengan ketara.
Selain itu, jika sebilangan besar operasi logik digunakan secara berlebihan dalam prosedur tersimpan, penggunaan CPU juga akan meningkat, kerana reka bentuk asal pangkalan data MySQL memfokuskan pada pertanyaan yang cekap dan bukannya operasi logik.

  1. Struktur prosedur tersimpan menyukarkan untuk membangunkan prosedur tersimpan dengan logik perniagaan yang kompleks.


  2. Sukar untuk nyahpepijat prosedur tersimpan. Hanya beberapa sistem pengurusan pangkalan data membenarkan penyahpepijatan prosedur tersimpan. Malangnya, MySQL tidak menyediakan keupayaan untuk menyahpepijat prosedur tersimpan.
  3. Membangun dan mengekalkan prosedur tersimpan bukanlah mudah.
  4. Membangun dan mengekalkan prosedur tersimpan selalunya memerlukan set kemahiran khusus yang tidak dimiliki oleh semua pembangun aplikasi. Ini boleh menyebabkan masalah semasa fasa pembangunan dan penyelenggaraan aplikasi.

  5. mempunyai tahap pergantungan yang tinggi pada pangkalan data dan kebolehpindahan yang lemah.

  6. Definisi prosedur tersimpan MySQLFormat pernyataan asas prosedur tersimpan

    DELIMITER $$
    
    CREATE
        /*[DEFINER = { user | CURRENT_USER }]*/
        PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
        /*LANGUAGE SQL
        | [NOT] DETERMINISTIC
        | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
        | SQL SECURITY { DEFINER | INVOKER }
        | COMMENT 'string'*/
    	BEGIN
    		[DECLARE 变量名 类型 [DEFAULT 值];]
    		存储过程的语句块;
    	END$$
    
    DELIMITER ;
  7. ● Parameter dalam prosedur tersimpan adalah masuk, keluar , tiga jenis inout;

in mewakili parameter input (dalam parameter secara lalai), menunjukkan bahawa nilai parameter mesti ditentukan oleh program panggilan.

    ou mewakili parameter output, yang bermaksud bahawa selepas nilai parameter dikira oleh prosedur tersimpan, hasil pengiraan parameter keluar dikembalikan kepada program panggilan.
  1. inout mewakili parameter input serta-merta dan parameter output Ini bermakna nilai parameter boleh dirumuskan oleh program panggilan, dan hasil pengiraan parameter inout boleh dikembalikan. kepada program panggilan.
  2. ● Penyata dalam prosedur tersimpan mesti disertakan antara MULA dan TAMAT.
  3. ● DECLARE digunakan untuk mengisytiharkan pembolehubah lalai menggunakan DEFAULT Untuk menukar nilai pembolehubah dalam blok pernyataan, gunakan SET pembolehubah = nilai

  4. Penggunaan prosedur tersimpan

Tentukan prosedur tersimpan

DELIMITER $$

CREATE
    PROCEDURE `demo`.`demo1`()
	-- 存储过程体
	BEGIN
		-- DECLARE声明 用来声明变量的
		DECLARE de_name VARCHAR(10) DEFAULT '';
		
		SET de_name = "jim";
		
		-- 测试输出语句(不同的数据库,测试语句都不太一样。
		SELECT de_name;
	END$$

DELIMITER ;

Panggil prosedur tersimpan

CALL demo1();
Bagaimana untuk memanggil prosedur tersimpan MySQL

Tentukan a berparameter Prosedur tersimpan

mula-mula mentakrifkan jadual pangkalan data pelajar:

Bagaimana untuk memanggil prosedur tersimpan MySQL

现在要查询这个student表中的sex为男的有多少个人。

DELIMITER $$

CREATE
    PROCEDURE `demo`.`demo2`(IN s_sex CHAR(1),OUT s_count INT)
	-- 存储过程体
	BEGIN
		-- 把SQL中查询的结果通过INTO赋给变量
		SELECT COUNT(*) INTO s_count FROM student WHERE sex= s_sex;
		SELECT s_count;
		
	END$$
DELIMITER ;

调用这个存储过程

-- @s_count表示测试出输出的参数
CALL demo2 ('男',@s_count);

Bagaimana untuk memanggil prosedur tersimpan MySQL

定义一个流程控制语句 IF ELSE

IF 语句包含多个条件判断,根据结果为 TRUE、FALSE执行语句,与编程语言中的 if、else if、else 语法类似。

DELIMITER $$
CREATE
    PROCEDURE `demo`.`demo3`(IN `day` INT)
	-- 存储过程体
	BEGIN
		IF `day` = 0 THEN
		SELECT '星期天';
		ELSEIF `day` = 1 THEN
		SELECT '星期一';
		ELSEIF `day` = 2 THEN
		SELECT '星期二';
		ELSE
		SELECT '无效日期';
		END IF;
		
	END$$
DELIMITER ;

调用这个存储过程

CALL demo3(2);

Bagaimana untuk memanggil prosedur tersimpan MySQL

定义一个条件控制语句 CASE

case是一种类似于编程语言中的choose和when语法的条件判断语句。MySQL 中的 case语句有两种语法格式。

第一种

DELIMITER $$
CREATE 
    PROCEDURE demo4(IN num INT)
	BEGIN
		CASE -- 条件开始
	
		WHEN num<0 THEN 
			SELECT &#39;负数&#39;;
		WHEN num>0 THEN 
			SELECT &#39;正数&#39;;
		ELSE 
		SELECT &#39;不是正数也不是负数&#39;;
	
		END CASE; -- 条件结束
	END$$
DELIMITER;

调用这个存储过程

CALL demo4(1);

Bagaimana untuk memanggil prosedur tersimpan MySQL

2.第二种

DELIMITER $$
CREATE 
    PROCEDURE demo5(IN num INT)
	BEGIN
		CASE num  -- 条件开始
		WHEN 1 THEN 
			SELECT &#39;输入为1&#39;;
		WHEN 0 THEN 
			SELECT &#39;输入为0&#39;;
		ELSE 
		SELECT &#39;不是1也不是0&#39;;
		END CASE; -- 条件结束
	END$$
DELIMITER;

调用此函数

CALL demo5(0);

Bagaimana untuk memanggil prosedur tersimpan MySQL

定义一个循环语句 WHILE

DELIMITER $$
CREATE 
    PROCEDURE demo6(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     WHILE num<10 DO -- 循环开始
	         SET num = num+1;
	         SET SUM = SUM+num;
	         END WHILE; -- 循环结束
	END$$
DELIMITER;

调用此函数

-- 调用函数
CALL demo6(0,@sum);

-- 查询函数
SELECT @sum;

Bagaimana untuk memanggil prosedur tersimpan MySQL

定义一个循环语句 REPEAT UNTLL

REPEATE…UNTLL 语句的用法和 Java中的 do…while 语句类似,都是先执行循环操作,再判断条件,区别是REPEATE 表达式值为 false时才执行循环操作,直到表达式值为 true停止。

-- 创建过程
DELIMITER $$
CREATE 
    PROCEDURE demo7(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     REPEAT-- 循环开始
		SET num = num+1;
		SET SUM = SUM+num ;
		UNTIL num>=10
		END REPEAT; -- 循环结束
	END$$
DELIMITER;

调用此函数

CALL demo7(9,@sum);

SELECT @sum;

Bagaimana untuk memanggil prosedur tersimpan MySQL

定义一个循环语句 LOOP

循环语句,用来重复执行某些语句。

执行过程中可使用 LEAVE语句或者ITEREATE来跳出循环,也可以嵌套IF等判断语句。

LEAVE 语句效果对于Java中的break,用来终止循环;

ITERATE语句效果相当于Java中的continue,用来跳过此次循环。进入下一次循环。且ITERATE之下的语句将不在进行。

DELIMITER $$
CREATE 
    PROCEDURE demo8(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     demo_sum:LOOP-- 循环开始
		SET num = num+1;
		IF num > 10 THEN
		    LEAVE demo_sum; -- 结束此次循环
		ELSEIF num < 9 THEN
		    ITERATE demo_sum; -- 跳过此次循环
		END IF;
		
		SET SUM = SUM+num;
		END LOOP demo_sum; -- 循环结束
	END$$
DELIMITER;

调用此函数

CALL demo8(0,@sum);

SELECT @sum;

Bagaimana untuk memanggil prosedur tersimpan MySQL

使用存储过程插入信息

DELIMITER $$
CREATE 
    PROCEDURE demo9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20))
	BEGIN
	   -- 声明一个变量 用来决定这个名字是否已经存在
	   DECLARE s_count INT DEFAULT 0;
	   -- 验证这么名字是否已经存在
	   SELECT COUNT(*) INTO s_count FROM student WHERE `name` = s_student;	
	   IF s_count = 0 THEN
	        INSERT INTO student (`name`, sex) VALUES(s_student, s_sex);
		SET s_result = &#39;数据添加成功&#39;;
	   ELSE
                SET s_result = &#39;名字已存在,不能添加&#39;;
                SELECT s_result;
	   END IF;
	END$$
DELIMITER;

调用此函数

CALL demo9("Jim","女",@s_result);

Bagaimana untuk memanggil prosedur tersimpan MySQL

再次调用次函数

CALL demo9("Jim","女",@s_result)

Bagaimana untuk memanggil prosedur tersimpan MySQL

存储过程的管理

显示存储过程

SHOW PROCEDURE STATUS

Bagaimana untuk memanggil prosedur tersimpan MySQL

显示特定数据库的存储过程

SHOW PROCEDURE STATUS WHERE db = &#39;db名字&#39; AND NAME = &#39;name名字&#39;;

显示特定模式的存储过程

SHOW PROCEDURE STATUS WHERE NAME LIKE &#39;%mo%&#39;;

Bagaimana untuk memanggil prosedur tersimpan MySQL

显示存储过程的源码

SHOW CREATE PROCEDURE 存储过程名;

Bagaimana untuk memanggil prosedur tersimpan MySQL

删除存储过程

DROP PROCEDURE 存储过程名;

后端调用存储过程的实现

在mybatis当中,调用存储过程

<parameterMap type="savemap" id=“usermap"> 
	<parameter property="name" jdbcType="VARCHAR" mode="IN"/>
	<parameter property="sex" jdbcType="CHAR" mode="IN"/>
	<parameter property="result" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>

<insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> 
{call saveuser(?, ?, ?)} 
</insert >

调用数据库管理

HashMap<String, Object> map = new HashMap<String, Object>(); 
	map.put("name", "Jim"); 
	map.put("sex","男");
	userDao.saveUserDemo(map); 
	map.get(“result”);//获得输出参数

通过这样就可以调用数据库中的存储过程的结果。

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

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam