2017-11-16 6 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' 

私は、一般的にprocの保存されたMySQLを使用してから人々を落胆edures。この作業は、事実上すべてのアプリケーションプログラミング言語ではるかに簡単です。

+0

返信いただきありがとうございます。しかし私の要求は少し異なります。たとえば、あなたの例では、 'foo、bar'を取り出すことができましたが、私はこのようなものを見つけるでしょう: 'foo = 123、bar = 456' –

+1

同じ問題です。変数名を使用して値を取得することはできません。 –

関連する問題