Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL存储过程传入非常大的字符串值_Mysql_Sql_Database_String - Fatal编程技术网

MySQL存储过程传入非常大的字符串值

MySQL存储过程传入非常大的字符串值,mysql,sql,database,string,Mysql,Sql,Database,String,有没有一种方法可以将非常长的字符串值传递给存储过程?我知道VARCHAR的上限是64000,但我传递的字符串可能不止这个。在我的例子中,我传递一个查询字符串。是的,一个非常长的查询字符串,它将在一次遍历中更新几乎整个表。我一次完成这一切,因为效率在应用程序端非常重要,所以我只需生成sql,并将其传递给存储过程。这个查询字符串之所以如此之长,是因为我正在更新大约12列,可能有100行,我使用非常大的CASE语句来更新 无论如何,有没有办法处理这个问题?用CASE语句中的逻辑创建一个辅助表,然后重写

有没有一种方法可以将非常长的字符串值传递给存储过程?我知道VARCHAR的上限是64000,但我传递的字符串可能不止这个。在我的例子中,我传递一个查询字符串。是的,一个非常长的查询字符串,它将在一次遍历中更新几乎整个表。我一次完成这一切,因为效率在应用程序端非常重要,所以我只需生成sql,并将其传递给存储过程。这个查询字符串之所以如此之长,是因为我正在更新大约12列,可能有100行,我使用非常大的CASE语句来更新


无论如何,有没有办法处理这个问题?

用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;
您可以创建辅助表,如:

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');
我希望这个简单的例子能起到启发作用。

参见

存储过程(和函数)参数(以及存储函数的返回值)可以使用
*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
Q) 这些查询中有多少字节?Q) 当你尝试时,你到底犯了什么错误?