2014-10-11 54 views
-2

嗨我是新來的MySQL數據庫編程,我試圖創建一個過程,但它failes,給我的錯誤一樣架構錯誤在MySQL

架構創建失敗:您在您的SQL語法錯誤;檢查對應於你的MySQL服務器版本在4號線附近使用「」正確的語法手冊:

代碼現在用的就是

CREATE TABLE CUSTOMERS(
    ID INT    NOT NULL, 
    NAME VARCHAR (20)  NOT NULL, 
    AGE INT    NOT NULL, 
    ADDRESS CHAR (25) , 
    SALARY DECIMAL (18, 2), 
    PRIMARY KEY (ID) 
); 


INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1,'aff',2,3,5); 



CREATE PROCEDURE doiterate(p1 INT) 
BEGIN 
set p1 = 'ID'; 
select p1 from CUSTOMERS; 
END; 

..What我在這裏做用於使。語法錯誤?任何人都可以指出我的錯誤...

感謝名單

+0

不相關,但是,你最有可能做**不**需要'字符',但'varchar'。 'char'列總是用空格填充到定義的長度。所以如果你在'char(10)'列中存儲''1',數據庫將會存儲''1'填充9個空格字符。 – 2014-10-11 06:48:59

回答

2

這就是答案:

DELIMITER $$ 

CREATE PROCEDURE `test`.`new_procedure` (p1 INT) 
BEGIN 
set p1 = 'ID'; 
select p1 from CUSTOMERS; 
END $$ 

DELIMITER ; 
+0

讓我加一點解釋:當創建一個過程時,你必須用一個自定義的(在本例中爲'$$')替換默認的句子終結符';',這樣你就可以使用默認的終止符在你的過程中寫入指令。你的程序完成後,你必須用自定義終止程序結束程序,然後恢復默認程序,這樣你就可以繼續以通常的方式編寫查詢和指令了。 – Barranka 2014-10-11 07:02:23

+0

@Barranka它根本沒有幫助我..可以請你在sql小提琴上發佈一個工作示例 – 2014-10-11 07:26:46

+0

@ 4EACH沒有這沒有工作..它引發了同樣的錯誤..如果你在sql提琴上發佈工作示例 – 2014-10-11 07:28:18

0

仔細閱讀您的問題後,我想我已經想通了。

4EACH's answer是正確的分隔符的事情(我相應地評論)。但是還有一些誤會:

首先,您試圖將文本值分配給p1,並且它已在您的過程中定義爲INT參數!如果你希望它是一個文本值,你需要在你的程序開始時聲明它。其次,你正試圖在程序內部建立一個動態的SQL表達式......而這不是做到這一點的方法!如果你想這樣做,你需要使用準備好的語句。

一個可能的解決方案:

DELIMITER $$ 

CREATE PROCEDURE new_procedure() 
BEGIN 
    declare p1 varchar; 
    declare sql text; 

    set p1 = 'ID'; 
    set sql = concat('select `', p1, '` from CUSTOMERS'); 
    prepare stmt from sql; 
    execute stmt; 
END $$ 

DELIMITER ; 

好吧,我會留下上面的代碼,因爲它是,但我必須說:這是錯誤Quoting from the reference manual

以後在程序之外執行的存儲程序上下文準備,因爲他們走出去的程序結束時的範圍,將是不可用的是語句不能引用存儲過程或函數的參數或局部變量的聲明。作爲一種解決方法,請參閱用戶定義的變量,該變量也具有會話範圍;見Section 9.4, 「User-Defined Variables」

所以,重點是:如果你想定義這種事情,那麼你必須使用用戶變量。請注意,他們都沒有宣佈,但在第一個任務被初始化:

DELIMITER $$ 

CREATE PROCEDURE new_procedure() 
BEGIN 
    set @p1 = 'ID'; 
    set @sql = concat('select `', p1, '` from CUSTOMERS'); 
    prepare stmt from @sql; 
    execute stmt; 
END $$ 

DELIMITER ; 

是的,here is your SQL fiddle example


回答您的評論:

但我怎麼能傳遞列名稱在變量中?

這裏有一個辦法:

delimiter $$ 
CREATE PROCEDURE new_procedure (col varchar(255)) 
BEGIN 
    set @p1 = col; 
    set @sql = concat('select `', @p1, '` from CUSTOMERS'); 
    prepare stmt from @sql; 
    execute stmt; 
END $$ 
delimiter ; 

And here's the example


使用存儲過程做這樣的事情是......麻煩,因爲你需要準備在其內部聲明,但要做到這一點,必須使用增加過程範圍的用戶變量(不能使用局部變量來創建預準備語句)。如果你想這樣做沒有程序,你可以做這樣的事情:

set @cols = 'id, name'; -- If you want, enclose them in back-ticks: '`id`, `name`' 
set @sql = concat_ws(' ', 'select', @cols, 'from your_table'); 
prepare stmt from @sql; 
execute stmt; 
-- When you are done, deallocate the prepared statement 
deallocate prepare stmt; 
+0

..沒有它的問題..我得到同樣的錯誤..可以運行這個代碼在SQL小提琴.. ??當我運行它我得到錯誤 – 2014-10-11 07:39:01

+0

問題是在這裏我認爲是delimeter的情況.. – 2014-10-11 07:40:43

+0

使用phpmyadmin或mysql工作臺,我在sqlfiddle中得到的錯誤,我不能運行PROCEDURE :) – 4EACH 2014-10-11 07:41:49