2017-02-02 10 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')에 절차의 생성 문을 읽을 수 있습니다. 그런 다음 위의 SP를 실행 한 후 수동으로 (또는 쉘 스크립트, cron-job 등) sql을 실행하면 필요한 변경 사항이 적용됩니다.

편집 :이 모든 것은 동적으로 업데이트되는 SP가 실제로하고 싶은 것으로 가정합니다. 수정하려는 하드 코딩 된 부분을 대신 입력 매개 변수를 사용하거나 테이블에서 읽는 것과 같은 훨씬 더 깔끔한 솔루션이있을 수 있습니다.

관련 문제