1

I want to get the code used to create an existing procedure by using the command show create procedure and then store it in a variable. All this inside a procedure.

Problem

  • Set @var for creating user defined variables only works when the result contains one row and one column.
  • show create procedure proc_name returns multiple columns and I cant select the specific one which is Create Function

Question

How can I save the code for creating a procedure into a variable for later use.

4

2 に答える 2

3

information_schemaデータベースのルーチンテーブルを使用できます。

select
routine_definition
from
information_schema.routines
where
specific_name = 'nameOfYourStoredProcedure'

詳細については、このリンクを参照してください。

アップデート:

次に、自分で作成する必要があります。他に方法はありません。

select
CONCAT('CREATE PROCEDURE nameOfYourStoredProcedure ', routine_definition, 'END') /*something like that, this here is pseudo-code*/
from
information_schema.routines
where
specific_name = 'nameOfYourStoredProcedure'

更新2:

Devartのコメントを考慮すると、information_schemaデータベースのパラメータテーブルも使用する必要があります。

注:このテーブルはMySQL5.5.3で追加されました

詳細については、こちらをご覧ください。

私は正直なところ、これを解決する他の方法を知りません。また、ここで5.5.3に更新することはできません。幸運を。

于 2012-04-12T09:55:05.000 に答える
0

以下のスニペットはほとんどの場合に機能するはずですが、十分に単純になることを期待して作業を開始しました。しかし、対処すべき多くの問題と例外があります。

SHOW CREATE / MySQLDumpを使用する方がまだ良い解決策だと思います(変数への応答の読み取りは許可されていませんが)。

SELECT 
CONCAT_WS(' ',
        'DELIMITER $$\n',
        'CREATE ',
        CONCAT_WS('=',r.SECURITY_TYPE,CONCAT_WS('@',CONCAT('`',SUBSTRING_INDEX(r.`definer`,'@',1),'`'),CONCAT('`',SUBSTRING_INDEX(r.`definer`,'@',-1),'`'))),
        '\n',
        r.ROUTINE_TYPE,
        CONCAT_WS('.', ROUTINE_SCHEMA, ROUTINE_NAME),
        CONCAT('(',GROUP_CONCAT(CONCAT_WS(' ', p.PARAMETER_NAME, p.DTD_IDENTIFIER)),')'),
        IF(o_p.DTD_IDENTIFIER is not null,CONCAT('RETURNS ',o_p.DTD_IDENTIFIER),''),
        ROUTINE_DEFINITION,
        '$$') stmt_

FROM information_schema.routines r LEFT JOIN information_schema.parameters p ON p.SPECIFIC_SCHEMA = r.routine_schema AND p.specific_name = r.routine_name AND p.PARAMETER_MODE ='IN' LEFT JOIN information_schema.parameters o_p ON o_p.SPECIFIC_SCHEMA = r.routine o_p.specific_name = r.routine_name AND o_p.PARAMETER_MODE IS NULL WHERE ROUTINE_SCHEMA IN('_secured'、'tester')GROUP BY CONCAT_WS('。'、ROUTINE_SCHEMA、ROUTINE_NAME)

于 2016-11-07T09:00:16.473 に答える