-7
CREATE PROCEDURE P1 (
    IN input TEXT
    , IN `delimiter` VARCHAR(10)
    , IN `column1` VARCHAR(10)
    , IN `value1` VARCHAR(10)
    )
BEGIN


    SET @a = column1;
    SET @b = value1;

    select @a,@b;

    SET @c = CONCAT('INSERT INTO SplitValues2(',@a,') VALUES (',@b,')');

    select @c;
    PREPARE stmt FROM @c;

    select stmt;
    EXECUTE stmt;

 END
4

1 回答 1

2

您正在将未引用的字符串连接到准备好的语句中。假设一个调用P1如下:

CALL P1('qux', 'foo', 'bar');

然后@c将包含以下字符串:

INSERT INTO SplitValues2(foo) VALUES (bar)

这可能不是您想要的,因为它引用了一个名为的列foo和一些名为bar. 您可以考虑使用 MySQL 的QUOTE()函数来正确引用字符串值:

SET @c = CONCAT('INSERT INTO SplitValues2(',@a,') VALUES (',QUOTE(@b),')');

或者更好的是参数化您准备好的语句中的变量,以便在执行时传递它们:

SET @c = CONCAT('INSERT INTO SplitValues2(',@a,') VALUES (?)');
PREPARE stmt FROM @c;
EXECUTE stmt USING @b;

请注意,既不能参数化 SQL 标识符(例如列名),也不能使用QUOTE(). 因此,为了避免 SQL 注入攻击,应该手动引用和转义:

SET @c = CONCAT('INSERT INTO SplitValues2(`',REPLACE(@a,'`','``'),'` VALUES (?)');
于 2012-06-11T10:21:23.557 回答