如何在大写的Mysql中更改表的所有列 [英] How Can I Alter All The Columns Of A Table In Mysql In Upper Case

查看:92
本文介绍了如何在大写的Mysql中更改表的所有列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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 line

SELECT 'OK' FROM DUAL 

will 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆