我有一个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'
);
1条答案
按热度按时间e0bqpujr1#
过程参数不能用作变量字段名的SQL语法。
你可以使用
EXECUTE IMMEDIATE
的魔力来构造一个查询:要处理未找到,请使用DECLARE HANDLER。