2014-11-05 17 views
10

Tôi phải tạo một SP trả về một giá trị nếu nó hợp lệ hay không. Nhưng nó không trả lại bất cứ điều gì và tôi không biết, tại sao?Giá trị trả về thủ tục lưu trữ MySQL

CREATE DEFINER=`root`@`localhost` PROCEDURE `validar_egreso`(
    IN codigo_producto VARCHAR(100), 
    IN cantidad INT, 
    OUT valido INT(11) 
) 
BEGIN 
    DECLARE resta INT(11); 
    SET resta = 0; 

    SELECT (s.stock - cantidad) INTO resta 
    FROM stock AS s 
    WHERE codigo_producto = s.codigo; 

    IF (resta > s.stock_minimo) THEN 
     SET valido = 1; 
    ELSE 
     SET valido = -1; 
    END IF; 
    SELECT valido; 
END 
+0

Sử dụng [xử lý ngoại lệ] (http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html) trong SP của bạn. –

Trả lời

12

Bạn đã thực hiện quy trình đã lưu đúng cách nhưng tôi nghĩ bạn chưa tham chiếu biến số valido đúng cách. Tôi đã nhìn vào một số ví dụ và họ đã đặt một biểu tượng @ trước khi tham số như thế này @Valido

này tuyên bố SELECT valido; nên giống như SELECT @valido;

Look này tại liên kết này mysql stored-procedure: out parameter. Chú ý giải pháp với 7 upvotes. Anh ta đã tham chiếu tham số bằng ký hiệu @, do đó tôi đề nghị bạn thêm một ký hiệu @ trước khi tham số của bạn valido

Tôi hy vọng điều đó phù hợp với bạn. nếu nó bỏ phiếu và đánh dấu nó là câu trả lời. Nếu không, hãy nói cho tôi biết.

+1

đó là vấn đề ở nơi đầu tiên, thx rất nhiều !! :) – Juanma

+0

Đưa @ infront của biến làm cho nó biến phiên do người dùng xác định cụ thể, hoạt động tốt. Bạn cũng có thể khai báo biến này là 'DECLARE valido INT'. –

1

Cập nhật SP của bạn và xử lý ngoại lệ trong đó bằng cách sử dụng declare handler với get diagnostics để bạn biết liệu có ngoại lệ hay không. ví dụ:

CREATE DEFINER=`root`@`localhost` PROCEDURE `validar_egreso`(
IN codigo_producto VARCHAR(100), 
IN cantidad INT, 
OUT valido INT(11) 
) 
BEGIN 
DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
    GET DIAGNOSTICS CONDITION 1 
    @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT; 
    SELECT @p1, @p2; 
END 
DECLARE resta INT(11); 
SET resta = 0; 

SELECT (s.stock - cantidad) INTO resta 
FROM stock AS s 
WHERE codigo_producto = s.codigo; 

IF (resta > s.stock_minimo) THEN 
    SET valido = 1; 
ELSE 
    SET valido = -1; 
END IF; 
SELECT valido; 
END 
+0

"NHẬN ĐIỀU KIỆN DIAGNOSTICS 1" ở đây là gì? –

+0

Trình phân tích cú pháp MySQL 5.6 cho tôi biết rằng câu lệnh END trên khối xử lý SQLEXCEPTION cần một dấu chấm phẩy và DECLARE phải đứng trước khối khai báo trình xử lý. xem "13.6.4.1 Cú pháp DECLARE biến cục bộ" tại https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html. –

5

Add:

  • DELIMITER vào đầu và kết thúc của SP.
  • THỦ TỤC DROP NẾU DANH SÁCH validar_egreso; ở đầu
  • Khi gọi cho SP, hãy sử dụng @variableName.

Điều này phù hợp với tôi. (Tôi đã sửa đổi một số phần của tập lệnh của bạn để BẤT CỨ AI có thể chạy nó với các bảng của bạn).

DROP PROCEDURE IF EXISTS `validar_egreso`; 

DELIMITER $$ 

CREATE DEFINER='root'@'localhost' PROCEDURE `validar_egreso` (
    IN codigo_producto VARCHAR(100), 
    IN cantidad INT, 
    OUT valido INT(11) 
) 
BEGIN 

    DECLARE resta INT; 
    SET resta = 0; 

    SELECT (codigo_producto - cantidad) INTO resta; 

    IF(resta > 1) THEN 
     SET valido = 1; 
    ELSE 
     SET valido = -1; 
    END IF; 

    SELECT valido; 
END $$ 

DELIMITER ; 

-- execute the stored procedure 
CALL validar_egreso(4, 1, @val); 

-- display the result 
select @val; 
Các vấn đề liên quan