12

Khi tôi tạo quy trình đã lưu, tôi có thể tạo một số biến có? ví dụ:Đặt kết quả biến, từ truy vấn

CREATE PROCEDURE `some_proc`() 
BEGIN 

    DECLARE some_var INT; 
    SET some_var = 3; 
.... 

HỎI: nhưng làm thế nào để thiết lập kết quả biến từ truy vấn, đó là làm thế nào để làm cho một số như thế này:

DECLARE some_var INT; 
SET some_var = SELECT COUNT(*) FROM mytable ; 

?

+0

Xem tại đây, câu hỏi của bạn có thể trùng lặp. http://stackoverflow.com/questions/3888735/mysql-set-user-variable-from-result-of-query?rq=1 – bodi0

+1

Không, không thực sự là một bản sao. Chủ đề của http://stackoverflow.com/questions/3888735/mysql-set-user-variable-from-result-of-query?rq=1 là "biến do người dùng xác định". Câu hỏi này là về các biến cục bộ thủ tục lưu sẵn. Cú pháp trong câu trả lời của tôi cũng hoạt động cho các biến do người dùng định nghĩa, nhưng không phải là cách khác. –

Trả lời

33

Có nhiều cách để thực hiện việc này.

Bạn có thể sử dụng một subquery:

SET some_var = (SELECT COUNT(*) FROM mytable); 

(như ban đầu của bạn, chỉ cần thêm dấu ngoặc xung quanh query)

hoặc sử dụng các cú pháp SELECT INTO gán nhiều giá trị:

SELECT COUNT(*), MAX(col) 
INTO some_var, some_other_var 
FROM tab; 

Cú pháp truy vấn phụ nhanh hơn một chút (Tôi không biết tại sao) nhưng chỉ hoạt động để gán một giá trị duy nhất. Cú pháp chọn vào cho phép bạn đặt nhiều giá trị cùng một lúc, vì vậy nếu bạn cần lấy nhiều giá trị từ truy vấn, bạn nên thực hiện điều đó thay vì thực hiện truy vấn một lần nữa và một lần nữa cho mỗi biến.

Cuối cùng, nếu truy vấn của bạn không trả về một hàng nhưng là một kết quả, bạn có thể sử dụng cursor.

+0

Bạn bị nhầm lẫn. –

+0

Roland Bouman, cảm ơn rất nhiều, biến thể thứ hai của bạn đang hoạt động, nhưng trước hết không, dấu ngoặc đơn không giúp ích gì. :) –

+0

Không. Cả hai công việc. Bạn phải có lỗi cú pháp. mysql> delimiter // mysql> tạo hàm f() -> trả về int -> bắt đầu -> khai báo v int; -> set v = (chọn số (*) từ kép); -> return v; -> kết thúc; -> // Truy vấn OK, 0 hàng bị ảnh hưởng (0,05 giây) mysql> chọn f(); -> // + ------ + | f() | + ------ + | 1 | + ------ + 1 hàng trong bộ (0,00 giây) mysql> chọn phiên bản(); -> // + ----------- + | version() | + ----------- + | 5.5.20 | + ----------- + 1 hàng trong nhóm (0.00 giây) –

3

Câu lệnh chọn sau đây sẽ cho phép bạn lưu kết quả từ số (*).

SELECT COUNT(*) FROM mytable INTO some_var; 
+2

MySQL cho phép bạn đặt mệnh đề INTO là mệnh đề cuối cùng ở cuối câu lệnh. Tuy nhiên, trong SQL tiêu chuẩn nó xuất hiện giữa mệnh đề SELECT và FROM. –

+0

juergen d, cảm ơn rất nhiều. :) –