我在 SingleStore 中创建了以下过程
DELIMITER //
CREATE OR REPLACE PROCEDURE updateColumnModelName(tableName TEXT, columnName TEXT) AS
DECLARE has_column INT DEFAULT 0;
DECLARE command TEXT;
BEGIN
SELECT EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = tableName
AND COLUMN_NAME = columnName
) INTO has_column;
IF has_column THEN
SET command = CONCAT('ALTER TABLE ', table_name, ' ADD COLUMN ', column_name, ' LONGTEXT CHARACTER SET utf8mb4 NOT NULL');
ELSE
SET command = CONCAT('ALTER TABLE ', table_name, ' DROP COLUMN ', column_name);
END IF;
EXECUTE IMMEDIATE command;
END //
DELIMITER ;
程序创建没有问题,但是当我通过
调用它时CALL updateColumnModelName("Transcription", "ModelName");
我收到以下错误:
错误 1193 ER_UNKNOWN_SYSTEM_VARIABLE:未处理的异常 类型:ER_UNKNOWN_SYSTEM_VARIABLE (1193) 消息:未知的系统变量“comand”调用堆栈:#0 第 13 行 in
。example_db
updateColumnModelName
我尝试使用不同的方法
DECLARE dynamic_sql TEXT;
....
SET @stmt = command;
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
但是在这种情况下收到以下错误:
ERROR 1149 ER_SYNTAX_ERROR: line 20, syntax error at or near "stmt"
其实我也成功解决了这个问题。它与变量名有关,因为我对通过引用函数传递的值感到困惑。
这是可行的版本,以防任何人需要。
DELIMITER //
CREATE OR REPLACE PROCEDURE updateColumnModelName(tableName TEXT, columnName TEXT) AS
DECLARE has_column INT DEFAULT 0;
BEGIN
SELECT EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = tableName
AND COLUMN_NAME = columnName
) INTO has_column;
IF NOT has_column THEN
EXECUTE IMMEDIATE CONCAT('ALTER TABLE ', tableName, ' ADD COLUMN ', columnName, ' LONGTEXT CHARACTER SET utf8mb4 NOT NULL');
END IF;
END //
DELIMITER ;