2016-04-06 11 views
1

Mysql sürüm 5.5.38 var.İşleyiciden önce işleç temizle mysql

İçinde bir işlevi çağıran bir yordamı çağırdığımda, işleyici durumu etkinleşir ve işleme kadar yükselir. İşlevdeki bu işleyici koşuluna, işlemdeki işlemi etkilememeye ihtiyacım var. Fonksiyon ve prosedür dahil.

fonksiyonu:

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 ; 

prosedürü:

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 ; 

cevap

0

Ben sorunu çözmek olamaz, ama ben işlevini değiştirmek için bir çözüm buldum, ben şimdi IFNULL fonksiyonu içine boş bir sonuç yakalamak ve Seçimi boş bir sonuç gösterdiğinde belirli bir değer belirleyebilir.

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;