2009-07-11 46 views
23

Tôi có một mysql thủ tục lưu trữ từ này (google book), và một ví dụ là thế này:mysql lưu trữ-thủ tục: ra tham số

DELIMITER $$ 

DROP PROCEDURE IF EXISTS my_sqrt$$ 
CREATE PROCEDURE my_sqrt(input_number INT, OUT out_number FLOAT) 
BEGIN 
    SET out_number=SQRT(input_number); 
END$$ 

DELIMITER ; 

Thủ tục biên dịch tốt. (Tôi đang sử dụng MySQL Query Browser trong ubuntu).

Tuy nhiên khi tôi gọi thủ tục:

CALL my_sqrt(4,@out_value); 

(cũng trong trình duyệt truy vấn)

Nó trả về một lỗi:

(1064) check the manual that correspond to the... 

Tại sao không phải là ví dụ này làm việc?

Trả lời

29

Không thể sao chép. Nó làm việc tốt cho tôi:

mysql> CALL my_sqrt(4, @out_value); 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @out_value; 
+------------+ 
| @out_value | 
+------------+ 
| 2   | 
+------------+ 
1 row in set (0.00 sec) 

Có lẽ bạn nên dán toàn bộ thông báo lỗi thay vì tóm tắt nó.

+0

Dưới đây là toàn bộ lỗi: 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 'SELECT @out_value' tại dòng 2 – domagojk

+2

OK. Nghe có vẻ như tôi có liên quan đến việc bạn đang ở trong Trình duyệt truy vấn. Hãy thử nó từ công cụ dòng lệnh mysql. – chaos

+0

có cùng sự cố với QueryBrowser. – fubo

1

Tôi vừa cố gắng gọi một hàm trong thiết bị đầu cuối chứ không phải là Trình duyệt truy vấn MySQL và nó hoạt động. Vì vậy, có vẻ như tôi đang làm một cái gì đó sai trong chương trình ...

Tôi không biết những gì kể từ khi tôi gọi một số thủ tục trước khi thành công (nhưng có nơi không có thông số ra) ...

Đối với cái này tôi đã bước vào

CALL my_sqrt(4,@out_value); 
SELECT @out_value; 

Và nó kết quả với một lỗi:

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 'SELECT @out_value' at line 2

Kỳ lạ thay, nếu tôi viết chỉ:

012.
CALL my_sqrt(4,@out_value); 

Thông điệp kết quả là: "Truy vấn hủy"

tôi đoán, bây giờ tôi sẽ chỉ sử dụng thiết bị đầu cuối ...

2

Tôi biết đây là một chủ đề cũ, nhưng nếu có ai đang tìm kiếm một câu trả lời lý do tại sao thủ tục của họ không hoạt động trong bàn làm việc và nghĩ rằng kết quả duy nhất là "Truy vấn bị hủy" hoặc bất kỳ điều gì tương tự mà không có manh mối:

đầu ra có lỗi hoặc sự cố bị ẩn. Tôi không biết tại sao, tôi hiểu nó gây phiền nhiễu, nhưng nó ở đó. chỉ cần di chuyển con trỏ của bạn phía trên dòng phía trên thư, nó sẽ chuyển thành một mũi tên kép (lên và xuống), sau đó bạn có thể nhấp và kéo dòng đó lên, sau đó bạn sẽ thấy một bảng điều khiển với thông báo bạn đã bỏ lỡ!

5

Bạn phải sử dụng chữ ký chính xác cho tham số nhập * IN bị thiếu trong mã bên dưới.

CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT) 
+0

IN là tùy chọn, không có gì trước khi tham số ngụ ý IN –

+0

Vậy làm cách nào để chúng ta phân biệt tham số đó là cho Đầu vào hoặc Đầu ra ...? –

+0

Thực tiễn không tốt, tôi đồng ý nhưng truy vấn vẫn hợp lệ. –

1
SET out_number=SQRT(input_number); 

Thay vì viết này:

select SQRT(input_number); 

Xin đừng viết SET out_number và tham số đầu vào của bạn nên là:

PROCEDURE `test`.`my_sqrt`(IN input_number INT, OUT out_number FLOAT) 
+0

và truy vấn sql là GỌI my_sqrt (4, @ out_value); –

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