我想在SQL中创建一个函数,它接受字段名和字段类型,并返回一个布尔值。根据结果,我将决定是否更新字段类型。下面是debug的代码:
use teleport;
DELIMITER //
DROP FUNCTION IF EXISTS check_column_data_type;
CREATE FUNCTION check_column_data_type(table_name VARCHAR(255), column_name VARCHAR(255), data_type VARCHAR(255)) RETURNS longtext
BEGIN
DECLARE column_type longtext;
SELECT
GROUP_CONCAT(DATA_TYPE)
INTO column_type
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = "teleport"
AND TABLE_NAME = "tp_order" -- use special string for test
AND COLUMN_NAME = "content";
-- IF LOWER(column_type) = LOWER(data_type) THEN
-- RETURN(TRUE);
-- ELSE
-- RETURN(FALSE);
-- END IF;
RETURN(column_type); -- just show the content of column_type
END //
DELIMITER ;
select check_column_data_type('tp_order', 'content', 'varchar(10240)');
但输出真的令人费解,冗长而重复:
MariaDB [teleport]> source /home/teleport/www/teleport/teleport_update.sql
... ...
--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240),varchar(10240)
... ...
奇怪的不仅仅是结果。当我在函数中查询COLUMN_TYPE时,它返回NULL,但当我在Navicat中查询它时,它正常工作。在函数中,我必须使用DATA_TYPE。会有什么问题呢?我的实现方法是否正确?
如果我不使用函数,就使用navicat查询。结果是正确的:
SELECT
GROUP_CONCAT( COLUMN_TYPE )
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = "teleport"
AND TABLE_NAME = "tp_order"
AND COLUMN_NAME = "content";
结果:varchar(1024)
1条答案
按热度按时间hfsqlsce1#
由于查询返回一个表中一列的数据类型,因此不需要
GROUP_CONCAT
。实际问题是您使用的参数名与列名相同。使用前缀(如'in_')将参数与列名分开: