22.7. 存储过程(PROCEDURE)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

22.7.1. 存储程序

存储过程没有返回数据,需使用call proc()调用

CREATE DEFINER=`neo`@`%` PROCEDURE `angelfund`(IN `puid` VARCHAR(50), IN `ptime` DATETIME)
	LANGUAGE SQL
	NOT DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN

	DECLARE fusername VARCHAR(16) DEFAULT NULL;
	DECLARE fname VARCHAR(16) DEFAULT NULL;
	DECLARE fmembers_date VARCHAR(20) DEFAULT NULL;

	SELECT username,name,FROM_UNIXTIME(createtime) INTO fusername,fname,fmembers_date FROM members WHERE username = puid;

	IF fusername IS NOT NULL THEN
		INSERT IGNORE INTO angelfund(username,name,members_date,accounts_date,endtime,`status`,op,operator,`description`) value(fusername,fname,fmembers_date,ptime,DATE_ADD(ptime, INTERVAL +1 MONTH),'N','N','computer','');
	END IF;

END			
			

调用过程

call angelfund('100','2013-10-10 10:10:10');			
			

22.7.2. EXECUTE 执行 SQL

在过程中运行SQL,下面的例子是文件导出的例子。

			
DROP procedure IF EXISTS `export_file`;

DELIMITER $$
CREATE DEFINER=`dba`@`%` PROCEDURE `export_file`(IN file_name char(64), IN tabname char(64))
BEGIN
	set @sql = concat('SELECT * INTO OUTFILE ',"'/var/lib/mysql-files/",file_name,"'",' FROM ', tabname) ; 
    -- select @sql;
	PREPARE stmt FROM @sql; 
	EXECUTE stmt; 
	Deallocate prepare stmt;
END$$

DELIMITER ;
			
			

call 存储过程

 
			
call test.export_file('test', 'mytable');			
			
			

22.7.3. PREPARE 传递参数

			
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> SET @a = 3;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @b = 4;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
1 row in set (0.00 sec)

mysql> DEALLOCATE PREPARE stmt1;
Query OK, 0 rows affected (0.00 sec)

mysql> 			
			
			

22.7.4. 存储过程返回数据

			
USE `test`;
DROP procedure IF EXISTS `test`;

DELIMITER $$
USE `test`$$
CREATE DEFINER=`dba`@`%` PROCEDURE `test`(in a int, in b int ,out num int)
BEGIN

	set num = a + b;

END$$

DELIMITER ;



			
			

运行后返回结果 10

			
set @num = 0;
call test(3,7,@num);
select @num;
			
			

22.7.5. 结果集转JSON

			
			
USE `netkiller`;
DROP procedure IF EXISTS `table2json`;

DELIMITER $$
USE `netkiller`$$
CREATE DEFINER=`neo`@`%` PROCEDURE `table2json`(
IN `schema` VARCHAR(32), 
IN `table` VARCHAR(32), 
IN `id` VARCHAR(10), 
OUT rev VARCHAR(1024)
)
BEGIN
	SET @column = NULL;
	SET @str = NULL;

	SELECT 
    GROUP_CONCAT(fields) AS col INTO @column FROM (
		SELECT 
			CONCAT('"', COLUMN_NAME, '",', COLUMN_NAME) AS fields
		FROM
			INFORMATION_SCHEMA.Columns
		WHERE
			table_name = `table`
				AND table_schema = `schema`) AS tmptable;


	-- SELECT @column;


	SET @sql = CONCAT('SELECT json_object(',@column, ' ) as json INTO @str FROM ', `table`,' where id = ', `id`);

	-- SELECT @sql;

	PREPARE stmt FROM @sql; 
	EXECUTE stmt; 
	Deallocate prepare stmt;

	set rev = @str;

END$$

DELIMITER ;			
			
			

使用实例

			
set @rev = '0';
call netkiller.table2json('test', 'test', '1', @rev);
select @rev;
			
			

22.7.6. 例子·过程返回结果

			
USE `netkiller`;
DROP procedure IF EXISTS `trigger2json`;

DELIMITER $$
USE `netkiller`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `trigger2json`(
IN `schema` VARCHAR(32), 
IN `table` VARCHAR(32), 
OUT rev VARCHAR(1024)
)
BEGIN
	SET @column = NULL;
	SET @str = NULL;

	SELECT 
    GROUP_CONCAT(fields) AS col
INTO @column FROM
    (SELECT 
        CONCAT('"', COLUMN_NAME, '", NEW.', COLUMN_NAME) AS fields
    FROM
        INFORMATION_SCHEMA.Columns
    WHERE
        table_name = `table`
            AND table_schema = `schema`) AS tmptable;


-- SELECT @column;


	SET @sql = CONCAT('SELECT json_object(',@column, ' ) as json INTO @str ');

	-- SELECT @sql; 

	PREPARE stmt FROM @sql; 
	EXECUTE stmt; 
	Deallocate prepare stmt;

	set rev = @str;

END$$

DELIMITER ;


			
			
			
set @rev = '0';
call neo.trigger2json('gw', 'member', @rev);
select @rev;			
			
			





原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 SQL Oracle
【Oracle系列】- 存储过程(Stored Procedure)
【Oracle系列】- 存储过程(Stored Procedure)
250 0
|
6月前
|
SQL 存储 分布式计算
DataWorks产品使用合集之在DataWorks中调用存储过程(PROCEDURE)如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
184 0
|
存储 SQL 数据库
存储过程(Stored Procedure)
存储过程(Stored Procedure)
96 1
|
6月前
|
存储 SQL 安全
函数(Function)和存储过程(Stored Procedure)的区别(小白情感版)
函数(Function)和存储过程(Stored Procedure)的区别(小白情感版)
248 0
|
存储 SQL Oracle
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
AnalyticDB PostgreSQL 7.0 新增了存储过程功能的支持,让用户在使用ADB PG时能够更方便高效地开发业务,并能够更好地兼容Oracle等传统数仓的业务。
494 1
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
|
存储 关系型数据库 MySQL
【MySQL】存储过程1305 - PROCEDURE xkgl.studnet_grade does not exist
存储过程不存在,重新执行创建存储过程的命令,查看是否有该存储过程。
|
存储 SQL 关系型数据库
SQL 存储过程 procedure 讲解+代码实例
SQL 存储过程 procedure 讲解+代码实例
SQL 存储过程 procedure 讲解+代码实例
|
存储 SQL Java
数据库小技能:存储过程(stored procedure)
过程(procedure)又叫存储过程(stored procedure),是一个有名称的PL/SQL程序块 。 过程相当于java中的方法, 它注重的是实现某种业务功能 。 函数(function)也相当于java中的方法,它 注重计算并且总是有返回结果 。 过程和函数都是能够永久存储在数据库中的程序代码块,应用时通过调用执行 。
148 1
|
存储 SQL 关系型数据库
MySQL数据库(31):存储过程 procedure
MySQL数据库(31):存储过程 procedure
195 0
|
存储 关系型数据库 MySQL
mysql存储过程——procedure[prəˈsiːdʒər]
mysql存储过程——procedure[prəˈsiːdʒər]
133 0
mysql存储过程——procedure[prəˈsiːdʒər]