2013-09-27 2 views
0

저장 프로 시저가 있습니다. 이 함수는 테이블과 트리거를 생성합니다. 테이블은 성공적으로 생성되었지만 지금까지는 트리거가 성공적으로 생성되지 않았습니다.MYSQL : 저장 프로 시저에서 트리거를 만드는 방법

소스 코드 :

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_inventarisasi`(IN _id_bbws INT, IN _nama_lokasi VARCHAR(100), IN _id_das INT, IN _ws VARCHAR(100), IN _id_provinsi INT, IN _id_kota_kab INT, IN _lat FLOAT(10,6), IN _lng FLOAT(10,6), IN _tahun_bangun INT, IN _id_tipe INT, IN _id_merk INT, IN _nama_pengamat VARCHAR(256)) 
BEGIN 
    DECLARE txn_error INTEGER DEFAULT 0; 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN 
       SET txn_error = 1; 
    END; 

    SET @tipealat = (SELECT nama_tipe FROM t_tipe WHERE id_tipe = _id_tipe); 
    SET @icon = 'default'; 

    IF UPPER(@tipealat) LIKE CONCAT(UPPER('PDA'), '%') THEN 
     SET @icon = 'pda'; 
    ELSEIF UPPER(@tipealat) LIKE CONCAT(UPPER('PCH'), '%') THEN 
     SET @icon = 'pch'; 
    END IF; 

    SAVEPOINT savepoint_pointer; 
    INSERT INTO `dhtml`.`t_inventarisasi` 
    (`id_bbws`,`nama_lokasi`,`id_das`,`ws`,`id_provinsi`,`id_kota_kab`,`lat`,`lng`,`tahun_bangun`, `id_tipe`,`id_merk`,`nama_pengamat`, `icon`) 
    VALUES 
    (_id_bbws, _nama_lokasi, _id_das, _ws, _id_provinsi, _id_kota_kab, _lat, _lng, _tahun_bangun, _id_tipe, _id_merk, _nama_pengamat, @icon); 
    IF txn_error = 1 THEN 
     ROLLBACK TO savepoint_pointer; 
     SELECT '<div class="alert alert-error"><button type="button" class="close" data-dismiss="alert">&times;</button><strong>Gagal!</strong> Input Data !</div>' AS hasil; 
    ELSE 
     SELECT '<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert">&times;</button><strong>Sukses!</strong> Input Data !</div>' AS hasil; 
     COMMIT; 

     SET @sql = CONCAT('CREATE TABLE `lokasi`.`',_nama_lokasi,'` (
                    `ReceivedDate` date NOT NULL, 
                    `ReceivedTime` time NOT NULL, 
                    `SamplingDate` date NOT NULL, 
                    `SamplingTime` time NOT NULL, 
                    `Rain` int(11) DEFAULT NULL, 
                    `WLevel` int(11) DEFAULT NULL, 
                    PRIMARY KEY (`ReceivedDate`,`ReceivedTime`,`SamplingDate`,`SamplingTime`) 
                  ) '); 
     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 

     SET @trigger = CONCAT('DELIMITER $$ 
           USE `lokasi`$$ 
           CREATE 
           DEFINER=`root`@`localhost` 
TRIGGER `lokasi`.`onINSERT_',_nama_lokasi,'` 
AFTER INSERT ON `lokasi`.`',_nama_lokasi,'` 
FOR EACH ROW 
BEGIN 
    IF NEW.WLevel > 0 THEN 
    SET @icon = \'pda\'; 
    SET @id_tipe = (SELECT id_tipe FROM `dhtml`.`t_tipe` WHERE UPPER(nama_tipe) LIKE UPPER(\'PDA%\') LIMIT 1); 
    SET @id_inventarisasi = (SELECT id_inventarisasi FROM `dhtml`.`t_inventarisasi` WHERE UPPER(nama_lokasi) = UPPER(\'',_nama_lokasi,'\') LIMIT 1); 
    IF NEW.ReceivedDate = CURDATE() THEN 
     IF NEW.WLevel > 500 && NEW.WLevel < 1500 THEN 
      SET @icon = \'normal\'; 
     ELSEIF NEW.WLevel > 1500 && NEW.WLevel < 2500 THEN 
      SET @icon = \'sedang\'; 
     ELSEIF NEW.WLevel > 2500 THEN 
      SET @icon = \'awas\'; 
     END IF;    
    ELSE 
     SET @10hari = (SELECT CURDATE() - INTERVAL 10 DAY); 
     IF NEW.ReceivedDate <= @10hari THEN 
      SET @icon = \'mati\'; 
     END IF;   

     SET @5hari = (SELECT CURDATE() - INTERVAL 5 DAY); 
     IF NEW.ReceivedDate > @10hari AND NEW.ReceivedDate <= @5hari THEN 
      SET @icon = \'tdkupdate\'; 
     END IF; 
    END IF; 
     UPDATE `dhtml`.`t_inventarisasi` SET icon = @icon WHERE id_inventarisasi = @id_inventarisasi AND id_tipe = @id_tipe; 
    END IF; 

END$$ 
'); 
     PREPARE stmt FROM @trigger; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    END IF; 

END 

는 몇 가지 힌트가 있습니까?

+0

오류가 발생합니까? 예인 경우 해당 세부 정보를 게시물에 추가하십시오. –

답변

0

확인 : http://forums.mysql.com/read.php?98,588793,588793#msg-588793을 확인하십시오. 1. 준비된 문에서 트리거를 만들 수 없습니다. 2. 저장 프로 시저에서 트리거를 만들 수 없습니다. 코드를 분할하면 PHP 코드에서 트리거를 생성하는 부분을 넣을 수 있습니다.

+0

mksh pak rachmat :) –

관련 문제