动态获取存储过程的参数值

时间:2017-11-16 15:21:06

标签: mysql database dynamic-sql

我正在为所有存储过程创建一种审核功能。我能够获取存储过程具有的参数的名称(来自:information_schema.parameters表)。 但是,我想为所有存储过程创建通用代码,以获取参数的名称,并相应地获取该调用的参数值并登录到另一个表。

e.g。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `TestSP`(IN `name` VARCHAR(255), IN `userid` INT(255), IN `isnew` VARCHAR(11))
BEGIN

#DECLARE exit handler for sqlexception  ROLLBACK;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;

INSERT INTO app_db_log(TYPE,MESSAGE, INFO) VALUES ('ERROR','An error has occurred, operation rollback and the stored procedure was terminated',<INSERT ALL THE PARAMETER VALUES AS SINGLE STRING HERE> );
COMMIT;

SELECT 'An error has occurred, operation rollback and the stored procedure was terminated';
END;

START TRANSACTION;
SIGNAL SQLSTATE '45000';
COMMIT;
END$$
DELIMITER ;

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以从INFORMATION_SCHEMA.PARAMETERS获取例程的参数列表,但您必须知道该过程的架构和名称:

loss: 562.0562

您需要使用动态SQL来执行此操作,但不能在动态SQL中引用存储的proc参数:

演示:

mysql> delimiter $$

mysql> create procedure myproc (in foo int, in bar int)
    -> begin
    -> select group_concat(parameter_name order by ordinal_position) as params
    -> from INFORMATION_SCHEMA.PARAMETERS
    -> where specific_schema='test' and specific_name='myproc';
    -> end$$

mysql> call myproc(123, 456)$$
+---------+
| params  |
+---------+
| foo,bar |
+---------+

我通常不鼓励人们使用MySQL存储过程。几乎任何应用程序编程语言都可以轻松完成这项任务。