Хранимая процедура MySQL - проблема с выводом значений - PullRequest
0 голосов
/ 18 ноября 2010

Я пытаюсь запустить следующую хранимую процедуру, однако она не дает никакого вывода .. Если я выбираю значения без использования параметров OUT, все работает нормально ..

ВЫБЕРИТЕ СЛОВО, REPLYATTR; - Это прекрасно работает

Но делать это «правильно» не по какой-то причине, ребята, идеи?

DROP PROCEDURE `uuu`//

CREATE DEFINER=`auth_tracker`@`%` PROCEDURE `uuu`( IN USERNAME varchar(100), 
                                                   OUT REPLYATTR varchar(100),
                                                   OUT PWORD varchar(100) )

BEGIN

DECLARE USER_PROD_ID INTEGER; 
DECLARE ATTR VARCHAR(100); 
DECLARE VAL VARCHAR(100); 
DECLARE no_more_rows BOOLEAN; -- Loop exit condition; set by NOT FOUND handler

DECLARE PoolHint VARCHAR(100) DEFAULT NULL;
DECLARE FramedIP VARCHAR(100) DEFAULT NULL; 
DECLARE FramedRoute VARCHAR(100) DEFAULT NULL;  

-- DECLARE PWORD VARCHAR(100) DEFAULT NULL;
-- DECLARE REPLYATTR VARCHAR(100);


DECLARE cur1 CURSOR 
    FOR 
 SELECT attribute_name, value
   FROM user_product_attribute upa, product_attribute pa
  WHERE upa.product_attribute_id = pa.product_attribute_id
    AND upa.user_product_id = USER_PROD_ID;

-- Declare handler to set loop exit condition
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

-- Main logic 
SELECT upa.user_product_id
  INTO USER_PROD_ID
  FROM user_product_attribute upa, user_product up, product_attribute pa, product p
 WHERE pa.attribute_name = 'username'
   AND pa.product_attribute_id = upa.product_attribute_id
   AND pa.product_id  = p.product_id

   AND up.status      = 'active'
   AND p.product_name = 'broadband'
   AND upa.value      = USERNAME

 LIMIT 1;

  -- Open the cursor
  OPEN cur1;

  -- Start Looping
  the_loop: LOOP

  -- Get Attrib + value
  FETCH cur1
    INTO ATTR, VAL;

  -- Exit if no rows
  IF no_more_rows THEN
    CLOSE cur1;
    LEAVE the_loop;
  END IF;

  -- Grab certain vars
  IF ATTR = 'poolhint' THEN SET PoolHint := VAL; END IF;
  IF ATTR = 'Framed-IP-Address' THEN SET FramedIP := VAL; END IF;
  IF ATTR = 'Framed-Route' THEN SET FramedRoute := VAL; END IF;
  IF ATTR = 'password' THEN SET PWORD := VAL; END IF;

  -- End Loop    
  END LOOP the_loop;

-- Concat 
IF (FramedIP IS NOT NULL) THEN SET REPLYATTR := CONCAT('Framed-IP-Address=',FramedIP);
ELSEIF (PoolHint IS NOT NULL) THEN SET REPLYATTR := CONCAT('PoolHint=',PoolHint);  
END IF;

-- Add Route
IF (FramedIP IS NOT NULL AND FramedRoute IS NOT NULL) 
THEN SET REPLYATTR := CONCAT(REPLYATTR,',Framed-Route="',FramedRoute,'"');
END IF;

END//

1 Ответ

1 голос
/ 18 ноября 2010

Как вы вызываете процедуру?

Если вы передаете пользовательские переменные при вызове процедуры, вы должны получить желаемый результат.

Пример:

CALL uuu('bobby',@replyattr,@pname);
SELECT @replyattr,@pname;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...