2009-03-12 36 views
6

tôi gặp khó khăn trong việc định vị lỗi khi cố gắng tạo một thủ tục được lưu trữ trong mysql.Lỗi cú pháp SQL khi tạo một thủ tục lưu sẵn trong MYSQL

nếu tôi chạy từng dòng của thủ tục độc lập, mọi thứ hoạt động tốt.

CREATE PROCEDURE cms_proc_add_child (param_parent_id INT, param_name CHAR(255), param_content_type CHAR(255)) 
BEGIN 
    SELECT @child_left := rgt FROM cms_tree WHERE id = param_parent_id; 
    UPDATE cms_tree SET rgt = rgt+2 WHERE rgt >= @child_left; 
    UPDATE cms_tree SET lft = lft+2 WHERE lft >= @child_left; 
    INSERT INTO cms_tree (name, lft, rgt, content_type) VALUES (param_name, @child_left, @child_left+1, param_content_type); 
END 

tôi nhận được (hữu ích) lỗi sau: ERROR 1064 (42000): Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần '' tại dòng 3… tôi chỉ không biết bắt đầu gỡ lỗi ở đâu, vì mỗi một dòng này đều đúng.

mẹo nào?

Trả lời

20

Vì dòng 3 chứa ; đầu tiên có lẽ bạn gặp sự cố với dấu phân tách của mình.

http://dev.mysql.com/doc/refman/5.0/en/stored-programs-defining.html

 
mysql> delimiter // 

mysql> CREATE PROCEDURE dorepeat(p1 INT) 
    -> BEGIN 
    -> SET @x = 0; 
    -> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; 
    -> END 
    -> // 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
1

Bạn không bao giờ khai báo biến @child_left của mình.

1

Cảm ơn, thấy gần '' tại dòng 3 là vấn đề của tôi và báo cáo kết quả delimiter cố định nó! Tôi luôn muốn mọi thứ có ý nghĩa và điều này. Như '' chỉ ra nó ở phần cuối của thủ tục, nhưng không có câu lệnh END nào được tìm thấy, do đó lỗi cú pháp. Và tôi tự hỏi tại sao tôi lại thấy rất nhiều người sử dụng câu lệnh phân cách. Tôi thấy ánh sáng!

Các vấn đề liên quan