2017-02-02 16 views
0

別のストアドプロシージャ内からストアドプロシージャを作成する方法はありますか?MySQL別のストアドプロシージャ内でストアドプロシージャを作成する

私たちは、テーブル内のデータベースのバージョンをチェックし、一時的なストアドプロシージャを使用して、データベースの更新を処理している:

DELIMITER # 
DROP PROCEDURE IF EXISTS sp_temp_update_table# 
CREATE PROCEDURE sp_temp_update_table() 
BEGIN 
    DECLARE v_db_version DECIMAL(10,6); 

    SELECT CAST(`value` AS DECIMAL(10,6)) INTO v_db_version 
    FROM `db_metadata` meta 
    WHERE meta.`key` = 'db_version'; 

    IF(v_db_version < CAST('13.30' AS DECIMAL(10,6))) THEN 
     -- UPDATE STATEMENTS HERE 
     ALTER TABLE `foo` ADD COLUMN `bar` INT(10); 

     UPDATE `etl_metadata` SET `value` = '13.30' WHERE `key` = 'db_version'; 
     SELECT CONCAT('13.30 Update Applied - Original db_version=', v_db_version); 
    ELSE 
     SELECT '13.30 Update Not Needed'; 
    END IF; 
END# 
CALL sp_temp_update_table()# 
DROP PROCEDURE IF EXISTS sp_temp_update_table# 
DELIMITER ; 

は、今、私たちは、このプロシージャ内からストアドプロシージャを更新する必要があります。

MySQLでこれを実現する方法はありますか?

答えて

1

create a stored procedure in a prepared statementはMySQLで使用できません。通常はcan't do anything in a stored procedure that you can't do in a prepared statementです。あなた

は、あなたのストアドプロシージャがストアドプロシージャを更新するためのコマンドが含まれている単一のSQLスクリプトを作成してもらうために、例えば、使用できる文字列(select routine_definition into myVar from information_schema.routines where routine_name='myRoutine')に手順のcreate文を読むことができます。上記のSPを実行した後、手動で(またはシェルスクリプト、cron-jobなどから)そのsqlを実行すると、必要な変更が行われます。

EDIT:これはすべて、動的に更新するSPが実際にやりたいことを前提としています。変更したいハードコーディングされた部分を、入力パラメータを取ったり、テーブルから読み込んだりするなど、もっとクリーンなソリューションがあるかもしれません。

関連する問題