存儲過程沒有返回數據,需使用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');
在過程中運行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');
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>
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;
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;
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;