2013-11-26 85 views
0

對於我的生活,我想不通爲什麼我收到此錯誤:MySQL的存儲過程1064錯誤

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1

我打電話一些變量通過一個簡單的存儲過程是什麼你不會在這裏看到分隔符的設置//,但這也完成了。

非常感謝!

SET @dest_database     = 'my_db'; 
SET @table_category_management_pages = 'category_management_pages'; 


CREATE PROCEDURE category_management_pages(
    IN in_name varchar(255), 
    IN in_display varchar(255), 
    IN in_notes varchar(255), 
    IN in_order INT, 
    IN in_title varchar(255), 
    IN in_access_name varchar(255) 
) 
    BEGIN 
    IF NOT EXISTS(
     SELECT * FROM information_schema.COLUMNS 
     WHERE 
     TABLE_SCHEMA = @dest_database AND 
     TABLE_NAME = @table_category_management_pages AND 
     COLUMN_NAME = 'key_hash' 
    ) THEN 
     # Add UNIQUE index on key_hash 
     SET @myPrep = CONCAT('ALTER TABLE `', @dest_database, '`.`', @table_category_management_pages, '` ADD COLUMN `key_hash` varchar(255) NULL, ADD UNIQUE INDEX (`key_hash`);'); 
     prepare stmt from @myPrep; 
     execute stmt; 
    END IF; 

    # Update key_hash to latest hash 
    SET @myPrep = CONCAT('UPDATE `', @dest_database, '`.`', @table_category_management_pages, '` 
     SET `key_hash` = md5(`name`)'); 
    prepare stmt from @myPrep; 
    execute stmt; 

END// 
+0

在使用之前是否在某處標明瞭** @ myPrep **? –

+0

我不認爲這是必需的。我有另一個過程,在這方面使用相同的語法運行良好。 –

+0

如果使用本地變量,則必須在使用之前聲明**。如果使用全局變量,則不需要聲明,因爲系統以前已聲明它。另外,檢查你的MySQL安裝。新版本在之前的版本中收緊了一些鬆懈的規則。 –

回答

0

我回答我的問題,因爲我找到了原因準備的語句不工作,這是很簡單的東西愚蠢的,但可能會影響其他人的未來。在我們公司,我們習慣於在聲明變量時排列所有等號(參見上面的編輯)。好吧,MySQL似乎不喜歡這種方式的空白,所以全局變量沒有正確傳遞到準備好的語句中。通過將聲明更改爲:

/* Globals */ 
SET @dest_database = 'my_db'; 
SET @table_category_management_pages = 'category_management_pages'; 

......算出來很好。去搞清楚。評論中的兩個建議都很好,但最終是由於空白造成的。非常令人沮喪,但我希望這可以幫助未來的人。

+0

似乎必須有其他東西,而不僅僅是空白。 MySQL對於間隔等號沒有問題,您可以通過設置變量,然後選擇'SELECT @dest_database,@table_category_management_pages;'來確認該分配是否正常工作......但錯誤消息確實表示那些東西是空的,因爲如果任何參數爲空,則concat()返回null,如果@foo爲null,則'PREPARE STMT FROM @ foo'將返回確切的錯誤。我假設你知道這些實際上不是「全局」變量,它們是用戶定義的變量,具有會話範圍。 –