0

우리의 마이그레이션 기능을위한 sql 스크립트를 만들고 있습니다. 한 magento 인스턴스에서 다른 magento 인스턴스로 데이터를 마이그레이션하려고합니다 (magento의 가져 오기/내보내기가 매우 제한적이기 때문에 순수한 SQL을 사용합니다).MySQL : prepared procedure in stored procedure - 매개 변수 오류 1064

여러 단계에서 수동으로 수행 할 필요가 없도록 표의 AUTO_INCREMENT 값을 동적으로 변경하려는 과제 중 하나입니다. 나는이에 대해 다음 저장 프로 시저를 준비 해당 열 + 1

의 전류 - 최대 값으로 AUTO_INCREMENT 값을 설정하려면 :

DELIMITER $$ 

    CREATE PROCEDURE alter_auto_inc_customer() 
    BEGIN 

     SELECT @max := MAX(entity_id)+ 1 FROM customer_entity; 

     PREPARE stmt FROM 'ALTER TABLE customer_entity AUTO_INCREMENT = ?'; 
     EXECUTE stmt USING @max; 

    END $$ 

이 명령은 원활하게 실행. 이후 절차는 단순한 문에 의해 호출해야합니다

CALL alter_auto_inc_customer(); 

나는 "전화"-statement을 실행하면, 나는 1064 구문 오류가 발생합니다. 그것은 사소한 일이지만 내 삶에 대해 알아 내지 못합니다 ...

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 

누구에게 어떤 이슈가 있습니까?

데이터베이스의 여러 테이블에 대해 유사한 명령문을 실행할 수 있어야하므로 하나 이상의 저장 프로 시저로 가져와야합니다.

답변

0

대신 테이블 구조를 변경 당신은 데이터를 삽입하기 전에 최대 값 + 1을 얻을 수있는 트리거를 사용할 수 있습니다 : 당신이 저장 프로 시저에서 테이블을 변경하려는 경우

DELIMITER $$ 
DROP TRIGGER IF EXISTS custom_autoincrement_bi$$ 

CREATE TRIGGER custom_autoincrement_bi BEFORE INSERT ON customer_entity 
FOR each ROW 
BEGIN 

    SET NEW.entity_id = select max(entity_id) + 1 from customer_entity; 

END$$ 

DELIMITER ; 

을하지만

DELIMITER $$ 

CREATE PROCEDURE alter_auto_inc_customer() 
BEGIN 

    SELECT MAX(entity_id) + 1 into @max FROM customer_entity; 
    set @sql = concat('ALTER TABLE customer_entity AUTO_INCREMENT = ', @max); 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt ; 
    DEALLOCATE PREPARE stmt; 

END $$ 
+0

안녕하세요, 그것은 할 수있는 해결 방법이지만 프로 시저를 사용하고 싶습니다. 내가 말했듯이 다중 테이블로이 작업을 수행해야하며 여러 번의 트리거 대신 한 번의 호출로 모든 작업을 처리하고 싶습니다. –

+0

일부 변경 사항이있는 저장 프로 시저를 추가하여 답변을 수정합니다. –

+0

절차는 매력처럼 작동합니다. 고마워요! –

관련 문제