如何在大写的Mysql中更改表的所有列 [英] How Can I Alter All The Columns Of A Table In Mysql In Upper Case
问题描述
DELIMITER //
DROP PROCEDURE IF EXTSTS uppercasecol //
CREATE PROCEDURE uppercasecol(IN tblname VARCHAR(200))
BEGIN
DECLARE完成INT DEFAULT 0;
DECLARE oldname VARCHAR(200);
DECLARE cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA ='ADM01'和TABLE_NAME = tblname;
DECLARE CONTINUE HANDLER for NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO oldname;
SET @newname = UPPER(oldname);
#IF newname等于oldname,什么都不做;
#select'a'<> '一个'; - > 0
#select'a'<> BINARY'A'; - > 1
SET @isNotSame = @newname<> BINARY oldname;
如果没有完成&& @ isNotSame那么
SET @SQL = CONCAT('ALTER TABLE`',tblname,'`CHANGE COLUMN`',oldname,'`@newname );
PREPARE tmpstmt FROM @SQL;
EXECUTE tmpstmt;
DEALLOCATE PREPARE tmpstmt;
END IF;
UNTIL完成END REPEAT;
CLOSE cur;
结束//
DELIMITER;
CALL uppercasecol('USER_MODULE');
我使用上面的代码将列名转换为大写但代码在CONCAT中给出错误1604(42000)('ALTER TABLE`',tblname,'`CHANGE COLUMN`',oldname,'`@新名字')。任何人都可以帮我解决这个问题...
提前预计
有一些错误。
这应该有效。
BEGIN
DECLARE done INT DEFAULT 0 ;
DECLARE oldname VARCHAR ( 200 );
DECLARE 数据类型 VARCHAR ( 200 );
DECLARE cur CURSOR FOR SELECT COLUMN_NAME,COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ' ADM01' AND TABLE_NAME = tblname;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1 跨度>;
OPEN cur;
REPEAT
FETCH cur INTO oldname,datatype;
SET @ newname = UPPER(oldname);
SET @ isNotSame = @ newname <> BINARY oldname;
IF NOT done&& @ isNotSame THEN
SET @ SQL = CONCAT(' ALTER TABLE `',tblname,' `CHANGE COLUMN`',oldname,' ``', @ newname ,' `',datatype);
PREPARE tmpstmt FROM @ SQL ;
EXECUTE tmpstmt;
DEALLOCATE PREPARE tmpstmt;
END IF ;
UNTIL完成 END REPEAT;
CLOSE cur;
SELECT ' OK' FROM DUAL;
END
最后一行< pre lang =SQL> SELECT ' OK' FROM DUAL会显示程序是否正确结束。
比较concat函数以找到你的错误。
当你在程序中出现错误并且你无法调试时,尝试删除代码行并重新执行它找到有问题的行/ s,或用常量替换变量来查看是否所有工作都按预期工作。
为了找到你的错误我做了程序返回也concat的结果:
SELECT
CONCAT(' ALTER TABLE`',tblname,' `CHANGE COLUMN`',oldname,' ``', @ newname ,' `',datatype)
FROM DUAL
所以我发现你动态执行的声明不正确。
F.
DELIMITER //
DROP PROCEDURE IF EXISTS uppercasecol //
CREATE PROCEDURE uppercasecol(IN tblname VARCHAR(200))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE oldname VARCHAR(200);
DECLARE cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='ADM01' AND TABLE_NAME=tblname;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO oldname;
SET @newname = UPPER(oldname);
#IF newname equals to oldname, do nothing;
#select 'a' <> 'A'; -> 0
#select 'a' <> BINARY 'A'; -> 1
SET @isNotSame = @newname <> BINARY oldname;
IF NOT done && @isNotSame THEN
SET @SQL = CONCAT('ALTER TABLE `',tblname,'` CHANGE COLUMN `',oldname,'` @newname');
PREPARE tmpstmt FROM @SQL;
EXECUTE tmpstmt;
DEALLOCATE PREPARE tmpstmt;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END //
DELIMITER ;
CALL uppercasecol('USER_MODULE');
I am using the above code to convert the column names to upper case but the code is giving error 1604(42000) in CONCAT('ALTER TABLE `',tblname,'` CHANGE COLUMN `',oldname,'` @newname'). Can anyone help me out in this...
thanx in advance
There was some errors.
this should work.
BEGIN DECLARE done INT DEFAULT 0; DECLARE oldname VARCHAR(200); DECLARE datatype VARCHAR(200); DECLARE cur CURSOR FOR SELECT COLUMN_NAME, COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='ADM01' AND TABLE_NAME=tblname; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; REPEAT FETCH cur INTO oldname, datatype; SET @newname = UPPER(oldname); SET @isNotSame = @newname <> BINARY oldname; IF NOT done && @isNotSame THEN SET @SQL = CONCAT('ALTER TABLE `', tblname, '` CHANGE COLUMN `', oldname, '` `', @newname, '`', datatype); PREPARE tmpstmt FROM @SQL; EXECUTE tmpstmt; DEALLOCATE PREPARE tmpstmt; END IF; UNTIL done END REPEAT; CLOSE cur; SELECT 'OK' FROM DUAL; END
The last lineSELECT 'OK' FROM DUALwill show you if the procedure will end correctly.
Compare the concat function to find your error.
When you have an error in procedure and you can't debug, try to remove lines of code and re execute it to find the offending line/s, or substitute the variable with constant to see if all works as expected.
To find your error I made the procedure return also the result of concat:
SELECT CONCAT('ALTER TABLE `', tblname, '` CHANGE COLUMN `', oldname, '` `', @newname, '`', datatype) FROM DUAL
So I found, also, that the statement you dynamically execute was incorrect.
F.
这篇关于如何在大写的Mysql中更改表的所有列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!