2017-02-11 101 views
1

我一直在試圖找出什麼我的beloe程序MySQL錯誤1064:在靠近1號線

CREATE PROCEDURE `example`(IN col_n char(50),IN p_cont char(50),IN p_ud int) 
BEGIN 

set @S = CONCAT('select rn.emp_id as  emp_id,controller,perma,permb,permc,permd,order from emp n 
join resource_emp rn on rn.emp_id = n.emp_id 
join resource r on r.resource_id = rn.resource_id 
join u_resource ur on ur.resource_id = r.resource_id 
join user u on u.u_id = ur.ur_id 
join( 
select title,min(order) as pr from emp n 
join resource_emp rn on rn.emp_id = n.emp_id 
join resource r on r.resource_id = rn.resource_id 
join u_resource ur on ur.resource_id = r.resource_id 
join user u on u.u_id = ur.ur_id 
where u.u_id = ',@p_ud,' group by title)a on a.title = n.title and a.pr = order 
where u.u_id = ',@p_ud,' n.con = ''',@p_cont,''' and ,@col_n,' = 1 
group by n.title order by n.order'); 

PREPARE stmt1 FROM @S; 

EXECUTE stmt1; 

DEALLOCATE PREPARE stmt1; 
END 

我試圖執行如下的過程中做錯了NULL,但有錯誤

call hop_thlc_t.auth('perma', 'submit', 2); 

錯誤代碼:1064.您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊,在第1行使用接近'NULL'的正確語法

雖然發生這種情況,但我仍然可以執行相同的操作並通過運行上述過程作爲查詢來獲得所需的結果使用以下PARAMS

set @col_n ='perma'; 
set @p_cont = 'submit' ; 
set @p_ud =2; 

任何有助於解決這個問題認識

+1

您在所有參數前添加了@,如何刪除它們? –

+0

嗨,當您在參數列表中使用'@ p_cont'時,您在查詢中看到@ p_con'。 – mandar

+0

錯字,糾正它 – RData

回答

1

只取@了你的變量是過程參數,因爲薩米Kuhmonen暗示的評論。

存儲過程中的局部變量在名稱前沒有@。如果你使用一個像@col_n這樣的變量,它與col_n不同,它是你的程序變量的變量。

變量@被稱爲Session Variables。他們在你的存儲過程之外有一個範圍。您發現您可以在調用您的程序之前設置該值。同樣,如果您在過程中設置了此變量的值,那麼在您的過程返回後它仍將具有該值。

我在我的答案貼了演示在這裏:https://stackoverflow.com/a/41925146/20860

不幸的是,有一個例外,每一個規則。當您使用PREPARE時,您的必須使用會話變量。局部變量對PREPARE不起作用。