2017-11-16 9 views
0

모든 저장 프로 시저에 대해 일종의 감사 기능을 만들고 있습니다. 저장 프로 시저에있는 매개 변수의 이름을 가져올 수 있습니다 (information_schema.parameters 테이블에서). 그러나 매개 변수의 이름을 가져와 해당 호출에 대한 해당 매개 변수의 값을 가져 와서 다른 테이블에 로그인하는 모든 저장 프로 시저에 대한 일반 코드를 만들고 싶습니다.저장 프로 시저의 매개 변수 값을 동적으로 가져옵니다.

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

당신은 INFORMATION_SCHEMA.PARAMETERS에서 루틴에 대한 매개 변수의 목록을 얻을 수 있지만, 프로 시저의 스키마 이름을 알고해야 할 것 :

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 | 
+---------+ 

당신이해야 할 동적 SQL을 사용해야합니다을 이 있지만, 동적 SQL에 저장된 프로 시저 매개 변수를 참조 할 수 없습니다 :

이 데모 :

mysql> create procedure myproc (in foo int, in bar int) 
    -> begin 
    -> set @sql = 'SELECT foo, bar'; 
    -> prepare stmt from @sql; 
    -> execute stmt; 
    -> end$$ 

mysql> call myproc(123, 456)$$ 
ERROR 1054 (42S22): Unknown column 'foo' in 'field list' 

내가 일반적으로 사람들을 낙담 MySQL의 저장된 프로 시저를 사용 edures. 이 작업은 거의 모든 응용 프로그래밍 언어에서 훨씬 쉬울 것입니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 제 요구 사항은 약간 다릅니다. 예를 들어 'foo, bar'를 가져올 수 있었지만 저장 프로 시저에서 'foo = 123, bar = 456'과 같은 것을 찾으려고합니다. –

+1

같은 문제 - 변수 이름을 사용하여 값을 가져올 수 없습니다. –