2014-11-05 10 views
10

मुझे एक एसपी बनाना है जो वैध मानता है या नहीं। लेकिन यह कुछ भी वापस नहीं करता है और मुझे नहीं पता, क्यों?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

अपने एसपी में [अपवाद हैंडलिंग] (http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html) का उपयोग करें। –

उत्तर

12

आप सही ढंग से संग्रहीत प्रक्रिया किया है लेकिन मुझे लगता है आप ठीक ढंग से संदर्भित नहीं है valido चर। मैं कुछ उदाहरण देख रहा था और वे इस @Valido

यह बयान SELECT valido; तरह पैरामीटर से पहले एक @ प्रतीक डाल दिया है इस लिंक mysql stored-procedure: out parameter पर इस SELECT @valido;

देखो की तरह होना चाहिए। 7 अपवॉट्स के साथ समाधान पर ध्यान दें। उन्होंने @ साइन के साथ पैरामीटर का संदर्भ दिया है, इसलिए मैंने सुझाव दिया है कि आप अपने पैरामीटर वैध

से पहले एक @ चिह्न जोड़ें, मुझे उम्मीद है कि यह आपके लिए काम करता है। अगर यह वोट देता है और इसे उत्तर के रूप में चिह्नित करता है। यदि नहीं, तो मुझे बताओ।

+1

जो पहली जगह में समस्या थी, थक्स बहुत ज्यादा !! :) – Juanma

+0

चर के अवरुद्ध @ को एक सत्र-विशिष्ट उपयोगकर्ता-परिभाषित चर बनाता है, जो ठीक काम करता है। आप चर को 'DECLARE valido INT' के रूप में भी घोषित कर सकते हैं। –

1

declare handler का उपयोग करके declare handler का उपयोग करके अपने एसपी को अपडेट करें और इसमें अपवाद संभाल लें ताकि आपको पता चले कि अपवाद है या नहीं। उदा।

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

यहां "डायग्नोस्टिक कंडीशन 1 प्राप्त करें" क्या है? –

+0

MySQL 5.6 पार्सर मुझे बताता है कि SQLEXCEPTION हैंडलर ब्लॉक पर END कथन को अर्धविराम की आवश्यकता होती है, और डेक्लेयर को हैंडलर घोषित करने वाले ब्लॉक से पहले होना चाहिए। https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html पर "13.6.4.1 स्थानीय वैरिएबल डेक्लेयर सिंटेक्स" देखें। –

5

जोड़ें:

  • शुरुआत और की सपा अंत में DELIMITER
  • ड्रॉप प्रक्रिया अगर EXISTS validar_egreso; शुरुआत में
  • एसपी को कॉल करते समय, @variableName का उपयोग करें।

यह मेरे लिए काम करता है। (मैंने आपकी स्क्रिप्ट के कुछ हिस्से को संशोधित किया है ताकि कोई भी आपकी टेबलों के साथ इसे चला सके)।

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; 
संबंधित मुद्दे