我正在为所有存储过程创建一种审核功能。我能够获取存储过程具有的参数的名称(来自: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 ;
提前致谢!
答案 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存储过程。几乎任何应用程序编程语言都可以轻松完成这项任务。