2013-09-28 56 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配給。

相關問題