有没有办法将极长的字符串值传递给存储过程?我知道 VARCHAR 的上限为 64,000,但我传递的字符串可能不止于此。就我而言,我正在传递一个查询字符串。是的,一个非常长的查询字符串,它将在 1 次内更新几乎整个表。我一次做这一切,因为效率是极其重要的应用程序端,所以我只是生成 sql,并将其传递给存储过程。这个查询字符串可能很长的原因是,我正在更新大约 12 列,可能有 100 行,而且我使用非常大的 CASE 语句来做到这一点。
无论如何,有没有办法处理这个?
见http://dev.mysql.com/doc/refman/5.6/en/blob.html
存储过程(和函数)参数(以及存储函数的返回值)可以用其中一种*TEXT
数据类型定义。
TINYTEXT up to 2^8-1 bytes
TEXT up to 2^16-1 bytes
MEDIUMTEXT up to 2^24-1 bytes
LONGTEXT up to 2^32-1 bytes
如何使用 CASE 语句中的逻辑创建一个辅助表并重写您的查询以使用该数据来修改目标表?
例如,假设我们使用 col1 和 col2 列中的值来更新 col3,如下所示:
CREATE TABLE Target (
col1 CHAR(1),
col2 CHAR(1),
col3 CHAR(1)
);
INSERT INTO Target VALUES('a', 'b', 'x');
INSERT INTO Target VALUES('c', 'b', 'x');
INSERT INTO Target VALUES('c', 'd', 'y');
INSERT INTO Target VALUES('e', 'f', 'z');
UPDATE Target
SET col3 = CASE
WHEN col1 = 'a' THEN 'i'
WHEN col1 = 'c' AND col2 = 'b' THEN 'i'
WHEN col1 = 'c' AND col2 = 'd' THEN 'j'
WHEN col2 = 'f' THEN 'k'
END;
您可以创建 Aux 辅助表,例如:
CREATE TABLE Aux (
col1 CHAR(1),
col2 CHAR(1),
col3 CHAR(1)
);
INSERT INTO Aux VALUES ('a', NULL, 'i');
INSERT INTO Aux VALUES ('c', 'b', 'i');
INSERT INTO Aux VALUES ('c', 'd', 'j');
INSERT INTO Aux VALUES (NULL, 'f', 'k');
并将更新查询重写为:
UPDATE
Target t,
Aux a
SET
t.col3 = a.col3
WHERE
COALESCE(t.col1, a.col1, '0') = COALESCE(a.col1, t.col1, '0')
AND
COALESCE(t.col2, a.col1, '0') = COALESCE(a.col2, t.col2, '0');
我希望这个简单的例子可以起到启发作用。