2013-09-28 58 views
0

有没有办法将超长字符串值传递给存储过程?我知道VARCHAR有64,000以上的限制,但是我传递的字符串可能不止于此。在我的情况下,我传递一个查询字符串。是的,这是一个非常长的查询字符串,它将在1个行中几乎更新整个表。我一次做所有事情,因为效率是非常重要的应用程序端,所以我只生成SQL,并将其传递给存储过程。这个查询字符串可能会这么长的原因是,我正在更新约12列可能100行,并且我用非常大的CASE语句来执行此操作。MySQL存储过程传递非常大的字符串值

无论如何,有没有办法解决这个问题?

+0

Q)这些查询有多少个字节?问)你试过的时候究竟发生了什么错误? – paulsm4

回答

1

参见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 
0

如何使用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'); 

我希望这个简单的例子可以作为一个inspi配给。

相关问题