MariaDB函数无法从INFORMATION_SCHEMA.COLUMNS中正确检索数据

xu3bshqb  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(166)

我想在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)

hfsqlsce

hfsqlsce1#

由于查询返回一个表中一列的数据类型,因此不需要GROUP_CONCAT
实际问题是您使用的参数名与列名相同。使用前缀(如'in_')将参数与列名分开:

DELIMITER //
DROP FUNCTION IF EXISTS check_column_data_type
//
CREATE FUNCTION check_column_data_type(
in_table_name VARCHAR(255),
in_column_name VARCHAR(255),
in_data_type VARCHAR(255)
) 
RETURNS longtext
BEGIN
DECLARE column_type longtext;
SELECT DATA_TYPE INTO column_type
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_SCHEMA = database() 
  AND TABLE_NAME = in_table_name   -- use special string for test
  AND COLUMN_NAME = in_column_name;
    -- 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

相关问题