2015-09-19 69 views
0

目前我正在使用數據庫,我得到了一個奇怪的錯誤wirth程序。我創建了一個獲取VARCHAR類型的三個參數:title, interpret, album。下面是代碼:程序失敗,但沒有變量的工作

BEGIN 
    INSERT IGNORE INTO Interpret (Name) VALUES (interpret); 
    SET @idInterpret := (SELECT id FROM Interpret WHERE Name = interpret); 

    INSERT IGNORE INTO Album (Name, Interpret) VALUES (album, @idInterpret); 
    SET @idAlbum := (SELECT id FROM Album WHERE Name = album AND Interpret = @idInterpret); 

    INSERT INTO Lied (Name, Album, Interpret) VALUES (title, @idAlbum, @idInterpret); 
END 

如果我開始這個過程,我得到它說,這張專輯字段不能爲空(這是正確的),而是因爲我讀從價值不應該是空的錯誤上面的表格。如果我用真實的數據調用完全相同的SQL語句(而不是使用變量的過程),所有的工作都很好。你有什麼想法,爲什麼發生這種情況?

+0

你可以在調試表中插入'@ idInterpret'和'@ idAlbum'嗎?或者以某種方式打印'@ idInterpret'和'@ idAlbum'?也許選擇沒有結果? – flaschenpost

回答

2

避免將變量和參數命名爲表格的列。

在您的查詢:

Interpret,你指表中的參數或列?我們知道是列,MySQL解釋是參數。

SQL Fiddle demo

見:在D.1 Restrictions on Stored Programs

按照使用本地varibales這種情況@貝恩德 - Buffen註釋存儲程序內

+0

你是對的謝謝你的回答。我認爲這是區分大小寫的,但似乎不是。 – Cilenco

+0

@Cilenco:'列,索引,存儲例程和事件名稱在任何平臺上都不區分大小寫,列別名也不區分大小寫。請參見[9.2.2標識符大小寫敏感性](http://dev.mysql.com/doc /refman/5.6/en/identifier-case-sensitivity.html)。 '參數名稱不區分大小寫.'請參見[13.1.15 CREATE PROCEDURE和CREATE FUNCTION語法](http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html)。 – wchiquito

0

要在存儲過程中使用變量,您必須使用DECLARE然後您可以使用它們而不用引號。我已更改您的查詢,但未經過測試。

BEGIN 
    DECLARE idInterpret DEFAULT =''; 
    DECLARE idAlbum  DEFAULT =''; 

    INSERT IGNORE INTO Interpret (Name) VALUES (interpret); 
    SELECT id IN TO idInterpret FROM Interpret WHERE Name = interpret; 

    INSERT IGNORE INTO Album (Name, Interpret) VALUES (album, idInterpret); 
    SELECT id INTO idAlbum FROM Album WHERE Name = album AND Interpret = idInterpret; 

    INSERT INTO Lied (Name, Album, Interpret) VALUES (title, idAlbum, idInterpret); 
END 
相關問題