7

I need to create a dynamic procedure so that whenever I need to rename a column of a table I pass the desired parameters and it executes without errors. So the verification of the IF.

The error generated by this code is as follows:

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 'IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = 'People'' at line 1

DROP PROCEDURE IF EXISTS `change_column_name`;

DELIMITER ;;
CREATE PROCEDURE `change_column_name`(IN tableName VARCHAR(100), IN columnName VARCHAR(100), IN newColumnName VARCHAR(100), IN columnType VARCHAR(20), IN defaultValue VARCHAR(100))
BEGIN
    SET @query = CONCAT('IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = \'', tableName, '\' AND column_name = \'', columnName, '\') THEN
                                ALTER TABLE \'', tableName, '\' CHANGE COLUMN \'', columnName, '\' \'', newColumnName, '\' ', columnType, ' DEFAULT ', defaultValue, ';
                        END IF;');

    PREPARE stmt1 FROM @query;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END ;;
DELIMITER ;

CALL `change_column_name`('People', 'Nme', 'Name', 'VARCHAR(50)', 'NULL');
Cœur
  • 37,241
  • 25
  • 195
  • 267
Luiz Negrini
  • 656
  • 10
  • 32

1 Answers1

1

Solved, the way the steps were made were wrong.

DROP PROCEDURE IF EXISTS `change_column_name`;

DELIMITER ;;
CREATE PROCEDURE `change_column_name`(IN tableName VARCHAR(100), IN columnName VARCHAR(100), IN newColumnName VARCHAR(100), IN columnType VARCHAR(20), IN defaultValue VARCHAR(100))
BEGIN
    IF EXISTS (SELECT * FROM information_schema.COLUMNS WHERE table_name = tableName AND column_name = columnName) THEN
        SET @query = CONCAT('ALTER TABLE `', tableName, '` CHANGE COLUMN `', columnName, '` `', newColumnName, '` ', columnType, ' DEFAULT ', defaultValue, ';');
        PREPARE stmt1 FROM @query;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;    
END ;;
DELIMITER ;

CALL `change_column_name`('People', 'Nme', 'Name', 'VARCHAR(50)', 'NULL');
Luiz Negrini
  • 656
  • 10
  • 32