2012-12-02 41 views
21

Tôi đang cố xác định và khởi tạo biến MySQL cho truy vấn.Biến cục bộ MySQL

tôi có như sau:

declare @countTotal int; 
SET @countTotal = select COUNT(*) 
from nGrams; 

Tôi đang sử dụng MySQL trong Netbeans và nó nói với tôi rằng tôi có một lỗi. Lỗi của tôi ở đâu?

Làm cách nào để khắc phục sự cố này?

Trả lời

31

MySQL có hai loại khác nhau của biến:

  • biến địa phương (mà không bắt đầu bởi @) được gõ mạnh mẽ và phạm vi vào khối chương trình được lưu trữ, trong đó chúng được khai báo. Lưu ý rằng, như tài liệu dưới DECLARE Syntax:

    DECLARE chỉ được phép trong một tuyên bố BEGIN ... END hợp chất và phải vào đầu của nó, trước khi bất kỳ báo cáo khác.

  • user variables (mà bắt đầu bằng @) đều được loại lỏng lẻo và scoped để phiên. Lưu ý rằng họ không cần hoặc không thể được tuyên bố — chỉ cần sử dụng chúng trực tiếp.

Do đó, nếu bạn đang xác định một chương trình lưu trữ và thực sự muốn có một "biến địa phương", mỗi từ ngữ trong câu hỏi của bạn, bạn sẽ cần phải thả các nhân vật @ và đảm bảo rằng tuyên bố DECLARE của bạn đang ở bắt đầu khối chương trình của bạn. Nếu không, để sử dụng "biến người dùng", hãy thả câu lệnh DECLARE.

Hơn nữa, bạn sẽ có cần phải bao vây truy vấn của bạn trong ngoặc đơn để thực hiện nó như một subquery:

SET @countTotal = (SELECT COUNT(*) FROM nGrams); 

Hoặc nếu không, bạn có thể sử dụng SELECT ... INTO:

SELECT COUNT(*) INTO @countTotal FROM nGrams; 
5

Hãy thử điều này: -

select @countTotal := COUNT(*) from nGrams; 
+0

Tôi nghĩ bạn có thể định sử dụng toán tử gán [[:: '] (http://dev.mysql.com/doc/en/assignment-operators.html#operator_assign-value), chứ không phải là [' = 'toán tử bình đẳng] (http://dev.mysql.com/doc/en/comparison-operators.html#operator_equal)? – eggyal

+0

Cảm ơn bạn đã cập nhật nội dung quan trọng đó @eggyal –

2

Function Ví dụ:

DROP FUNCTION IF EXISTS test; 

DELIMITER $$ 
CREATE FUNCTION test(in_number INT) RETURNS INT 
    BEGIN 
     DECLARE countTotal INT; 
     SET countTotal = SELECT COUNT(*) FROM nGrams; 
    RETURN countTotal + in_number; 
END $$ 
DELIMITER ; 
+0

một cách kỳ quặc mà nó mang lại cho tôi 0. Nếu tôi chọn * Tôi nhận được khoảng 100.000 hàng ... – CodeKingPlusPlus

+0

Bạn đang thực hiện một chức năng hoặc thủ tục? – alditis

+0

[Truy vấn phụ phải luôn xuất hiện trong ngoặc đơn.] (Https://dev.mysql.com/doc/en/subqueries.html) – eggyal

1

Theo DECLARE Syntax , declare phải nằm trong khối kết thúc ... bắt đầu.

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