检查表的MariaDB存储过程参数被解释为表字段

g6ll5ycj  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(107)

我有一个Drupal数据库(MariaDB 10.4.17),我尝试替换字段中的字符串,但前提是:
1.目标表存在;和
1.中的某个字段值包含特定值
然而,当我运行它时,它抛出错误Unknown column 'my_table' in 'field list',从我所读到的内容来看,这表明它正在表中查找具有该名称的 * 字段 *,但找不到它。
为什么会发生这种情况,如何使THEN块中的代码仅在表存在时才在表上执行?

USE myDatabase;

DELIMITER $$

CREATE PROCEDURE replaceLinks(
    tableName VARCHAR(255),
    fieldValue VARCHAR(255),
    fieldFormat VARCHAR(255)
)
BEGIN
    IF EXISTS (
        SELECT *
        FROM tableName
    ) THEN
        UPDATE tableName
        SET fieldValue = REPLACE(
                fieldValue,
                'TARGET_STR',
                'REPLACE_STR'
            )
        WHERE fieldFormat = 'html'
    END IF
END

DELIMITER ;

CALL replaceLinks(
    my_table field_value field_format
);

更新

我尝试使用@danblack的答案,无论我传递的表名是否存在,仍然得到相同的错误:Unknown column 'my_table' in 'field list' .
看起来有两个问题在起作用:
1.正如Dan所指出的,我试图使用过程参数作为字段名的变量;和
1.我还传递了不带引号的参数,尽管它们是字符串,所以它们没有被解释为这样。
这现在完全按照预期工作:

USE myDatabase;

DELIMITER $$

CREATE OR REPLACE PROCEDURE replaceLinks(
        tableName VARCHAR(255),
        fieldValue VARCHAR(255),
        fieldFormat VARCHAR(255)
    ) 
    BEGIN
        DECLARE EXIT HANDLER FOR 1146 SELECT 1;
        DECLARE EXIT HANDLER FOR 1054 SELECT 1;
        EXECUTE IMMEDIATE CONCAT(
            'UPDATE ',
            tableName,
            ' SET ',
            fieldValue,
            ' = REPLACE(',
            fieldValue,
            ',\'TARGET_STR\', \'REPLACE_STR\') WHERE ',
            fieldFormat,
            ' = \'html\''
        );
    END
$$

DELIMITER ;

CALL replaceLinks(
        'my_table', 'field_value', 'field_format'
    );
e0bqpujr

e0bqpujr1#

过程参数不能用作变量字段名的SQL语法。
你可以使用EXECUTE IMMEDIATE的魔力来构造一个查询:

CREATE OR REPLACE PROCEDURE replaceLinks(tableName VARCHAR(255),
  fieldValue VARCHAR(255),
  fieldFormat VARCHAR(255) )
EXECUTE IMMEDIATE CONCAT('UPDATE ',
  tableName,
  ' SET ',
  fieldValue,
  ' = REPLACE(',
  fieldValue,
  ',\'TARGET_STR\', \'REPLACE_STR\') WHERE ',
  fieldFormat,
  ' = \'html\'');

要处理未找到,请使用DECLARE HANDLER

BEGIN
DECLARE EXIT HANDLER FOR 1146 SELECT 1;
EXECUTE IMMEDIATE ....;
END$$

相关问题