2016-04-06 3 views
1

У меня есть версия mysql 5.5.38.Очистить обработчик перед возвратом функции функции в процедуру mysql

Когда я вызываю процедуру, вызывающую функцию внутри, обработчик устанавливает ее активированную функцию и поднимает до процедуры. Мне нужно, чтобы условие обработчика функции не влияло на процесс процедуры. Включена функция и процедура.

функция:

DELIMITER $$ 

CREATE FUNCTION FUNCTION_HOURLY_GAS_CHANGE(INI_DATE DATETIME, TANK INT) 
RETURNS INT 
NOT DETERMINISTIC 
BEGIN 
DECLARE END_GAL INT; 
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET END_GAL = -1; 
SET END_GAL = 0; 
SELECT GALLONS INTO END_GAL 
    FROM TLS_TEMP_DATA WHERE FK_TANK = TANK 
    AND DATE LIKE CONCAT(DATE_FORMAT(DATE_ADD(DATE_FORMAT(INI_DATE, '%Y-%m-%d %H'), INTERVAL 1 HOUR), '%Y-%m-%d %H'),':%') 
    AND REQUEST_TYPE = 1; 
RETURN END_GAL; 
END $$ 
DELIMITER ; 

процедура:

DELIMITER $$ 
    CREATE PROCEDURE HOURLY_GAS_CHANGE(IN dateReport char(50), IN tank INT) 
    BEGIN 
      DECLARE COMPLETELOOP INT DEFAULT 0; 
      DECLARE INI_DATE DATETIME; 
      DECLARE INI_GAL INT; 
      DECLARE END_GAL INT; 
      DECLARE DIFF INT; 
      DECLARE V_HOUR CHAR(50); 
      DECLARE V_INI_GAL CHAR(50); 
      DECLARE V_END_GAL CHAR(50); 
      DECLARE V_DIFF CHAR(50); 
      DECLARE INITIALDATA CURSOR FOR 
      SELECT 
        DATE, GALLONS FROM TLS_TEMP_DATA WHERE FK_TANK = tank 
        AND (DATE BETWEEN CONCAT(dateReport, ' 00:00:00') AND CONCAT(dateReport, ' 23:59:59')) AND REQUEST_TYPE = 1 
        ORDER BY ID; 
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET COMPLETELOOP = 1; 
      DROP TEMPORARY TABLE IF EXISTS HOURLYGASCHANGE; 
      CREATE TEMPORARY TABLE HOURLYGASCHANGE(
       `HOUR_DATA` CHAR(50) NOT NULL, 
       `INI_GAL` CHAR(50) NOT NULL, 
       `END_GAL` CHAR(50) NOT NULL, 
       `DIFF` CHAR(50) NOT NULL) 
       ENGINE=MEMORY; 

      OPEN INITIALDATA; 
      READ_LOOP: LOOP 
       FETCH INITIALDATA INTO INI_DATE, INI_GAL; 
       IF COMPLETELOOP THEN 
        LEAVE READ_LOOP; 
       END IF; 
       SET END_GAL = 1; 
       SET END_GAL = FUNCTION_HOURLY_GAS_CHANGE(INI_DATE, tank); 
       IF END_GAL > 0 THEN 
       SET DIFF = (END_GAL - INI_GAL); 
       SET V_DIFF = CAST(DIFF AS CHAR(50)); 
     SET V_END_GAL = CAST(END_GAL AS CHAR(50)); 
       ELSE 
       SET V_DIFF = 'N/A'; 
       SET V_END_GAL = 'NOT UPDATED'; 
       END IF; 
        SET V_INI_GAL = CAST(INI_GAL AS CHAR(50)); 
        SET V_HOUR = CAST(DATE_FORMAT(INI_DATE, '%H') AS CHAR(50)); 
        INSERT INTO HOURLYGASCHANGE VALUES(V_HOUR, V_INI_GAL, V_END_GAL, V_DIFF); 
      END LOOP; 
      close INITIALDATA; 
      SELECT * FROM HOURLYGASCHANGE; 
    END $$ 
    DELIMITER ; 

ответ

0

Я не могу решить эту проблему, но я нашел решение, чтобы заменить функцию, я захватить пустой результат в функции IFNULL и теперь я может установить конкретное значение, когда select покажет мне пустой результат.

SELECT (
IFNULL(
    (
    SELECT ENDTLS.GALLONS 
    FROM TLS_TEMP_DATA ENDTLS 
    WHERE ENDTLS.FK_TANK = tank 
    AND ENDTLS.DATE LIKE ONCAT(DATE_FORMAT(DATE_ADD(DATE_FORMAT(INI_DATE, '%Y-%m-%d %H'), INTERVAL 1 HOUR), '%Y-%m-%d %H'),':%') 
    AND ENDTLS.REQUEST_TYPE = 1 
) 
, -1) 
) INTO END_GAL;