2012-08-13 48 views
0

我在Window-7中的MySQL中創建了存儲過程。它在Windows上成功運行。但是當我切換到Ubuntu時,它會在存儲過程中發生錯誤。在Windows上我使用SQLyog來創建存儲過程。在Ubuntu上,我運行SQL腳本並調用該存儲過程,但出現錯誤。以下是我的存儲過程。存儲過程在Ubuntu中的mysql

DELIMITER $$ 

USE `adserver`$$ 

DROP PROCEDURE IF EXISTS `getDaypartTimeDetail`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `getDaypartTimeDetail` 
(currentDate DATE,noOfdays INT,cityId BIGINT) 
BEGIN 

DECLARE i INT; 
DECLARE dateCnt INT; 
SET dateCnt = 0; 

DROP TEMPORARY TABLE IF EXISTS OnlyDate; 
DROP TEMPORARY TABLE IF EXISTS AdvScheduleData; 
CREATE TEMPORARY TABLE OnlyDate(dday DATE); 
CREATE TEMPORARY TABLE AdvScheduleData(dday BIGINT,daypartId INT,totalFile BIGINT,totalDur BIGINT); 

/* Generate Dates */ 
WHILE(dateCnt < noOfdays) DO 
    SET i = 1; 
    INSERT INTO OnlyDate(dday) VALUES (DATE_ADD(currentDate, INTERVAL dateCnt DAY)); 
SET dateCnt = dateCnt + 1; 
END WHILE; 

/* Insert all dayparts for all dates */ 
INSERT INTO AdvScheduleData (dday, daypartID) SELECT (UNIX_TIMESTAMP(dday)*1000), id FROM OnlyDate, daypart; 
/* Update total files and duration */  
UPDATE AdvScheduleData SET 
    TotalFile = (SELECT COUNT(advt_id) 
      FROM adv_schedule AdvSch 
      INNER JOIN advertisement Adv ON Adv.id = AdvSch.advt_id 
       WHERE AdvScheduleData.dday BETWEEN AdvSch.start_date AND AdvSch.end_date 
       AND AdvSch.status = 2 
       AND AdvSch.active = 1 
       AND AdvSch.id IN (SELECT schedule_id FROM schedule_daypart 
       WHERE daypart_id = AdvScheduleData.daypartId) 
       AND AdvSch.id IN (SELECT schedule_id FROM schedule_cities WHERE city_id = cityId) 
       AND Adv.is_active = 1 
       AND Adv.is_deleted = 0 
       AND Adv.status = 2 
       AND Adv.expiry_date >= AdvScheduleData.dday), 
    totalDur = (SELECT SUM(Adv.duration) 
      FROM adv_schedule AdvSch 
      INNER JOIN advertisement Adv ON Adv.id = ADVSCH.advt_id 
       WHERE AdvScheduleData.dday BETWEEN AdvSch.start_date AND AdvSch.end_date 
       AND AdvSch.status = 2 
       AND AdvSch.active = 1 
       AND AdvSch.id IN (SELECT schedule_id FROM schedule_daypart 
       WHERE daypart_id = AdvScheduleData.daypartId) 
       AND AdvSch.id IN (SELECT schedule_id FROM schedule_cities WHERE city_id = cityId) 
       AND Adv.is_active = 1 
       AND Adv.is_deleted = 0 
       AND Adv.status = 2 
       AND Adv.expiry_date >= AdvScheduleData.dday); 
SELECT * FROM AdvScheduleData; 
END$$ 

DELIMITER ; 

我在Ubuntu中得到的輸出是

mysql> call getDaypartTimeDetail('2012-08-13',5,30534); ERROR 1054 (42S22): Unknown column 'ADVSCH.advt_id' in 'on clause'

+0

聽起來就像是adv_schedule表是你的兩個實例不同。你可以粘貼「desc adserver.adv_schedule;」的輸出從兩個? – Kadaan 2012-08-13 05:19:39

+0

您確定您已連接到相同的數據庫並查詢相同的表嗎? – 2012-08-13 05:19:44

+0

是的,我正在使用相同的數據庫,@Kadaan這個程序完美的運行在Windows上,它給出了正確的輸出。在Windows中沒有錯誤。 – vishal 2012-08-13 05:29:34

回答

1

表名和別名是區分在Ubuntu敏感。

因此,該引用給了一個錯誤:

totalDur = (SELECT SUM(Adv.duration) 
     FROM adv_schedule AdvSch 
     INNER JOIN advertisement Adv ON Adv.id = ADVSCH.advt_id 

將其更改爲AdvSch.advt_id

+0

感謝您的回答,它現在可以工作 – vishal 2012-08-13 06:22:08