2013-04-05 3 views
2

Я пытаюсь написать процедуру mySQL с помощью курсора для расчета тарифа. Я прохожу в stationid, тогда я выясню, в какой зоне они находятся. Стоимость проезда - это заданное значение $ 1 и дополнительные $ 0.20 для каждой зоны, в которую вошли. Код, который я до сих пор запускал, но есть проблема с курсором, а не выбор значений в переменные.mySQL Сохраненная процедура - ошибка курсора

Любая помощь была бы принята с благодарностью. Благодарности

Таблицы:

DROP DATABASE IF EXISTS luasSystem; 
    CREATE DATABASE luasSystem; 
    USE luasSystem; 

    CREATE TABLE IF NOT EXISTS line 
    (
    line_id INT NOT NULL AUTO_INCREMENT, 
    Line_colour CHAR(10) NOT NULL, 
    PRIMARY KEY (line_id) 
    ) ENGINE=InnoDB; 

    CREATE TABLE IF NOT EXISTS zone 
    (
    zone_id INT NOT NULL AUTO_INCREMENT, 
    zone_name VARCHAR(20) NOT NULL, 
     line INT NOT NULL, 
    PRIMARY KEY (zone_id), 
    FOREIGN KEY (line) REFERENCES line(line_id) ON UPDATE CASCADE ON DELETE RESTRICT 
    ) ENGINE=InnoDB; 

    CREATE TABLE IF NOT EXISTS station 
    (
    station_id INT NOT NULL AUTO_INCREMENT, 
    station_name CHAR(20) NOT NULL, 
    service CHAR(20), 
     line INT NOT NULL, 
     zone INT NOT NULL, 
    PRIMARY KEY (station_id), 
    FOREIGN KEY (line) REFERENCES line(line_id) ON UPDATE CASCADE ON DELETE RESTRICT, 
    FOREIGN KEY (zone) REFERENCES zone(zone_id) ON UPDATE CASCADE ON DELETE RESTRICT 
    ) ENGINE=InnoDB; 

хранимая процедура:

DROP PROCEDURE IF EXISTS calculateFare; 
    DELIMITER // 
    CREATE PROCEDURE calculateFare 
    (
    IN stationid1 INT, IN stationid2 INT 
    ) 
    BEGIN 

    DECLARE zoneNum1 INT; 
    DECLARE zoneNum2 INT; 
    DECLARE num INT; 
    DECLARE fare DOUBLE; 

    DECLARE tableEnd BOOLEAN; 

    DECLARE zoneCur CURSOR FOR 
    SELECT zone, zone FROM station 
    WHERE station_name = stationid1 AND station_name = stationid2; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET tableEnd = TRUE; 

    OPEN zoneCur; 
    the_loop: LOOP 

    FETCH zoneCur 
    INTO zoneNum1, zoneNum2; 

    IF tableEnd THEN 
    CLOSE zoneCur; 
    LEAVE the_loop; 
    END IF; 

    SET fare = 1; 
    SET num = 0; 

    IF zoneNum1 < zoneNum2 THEN 
    SET num = zoneNum2 - zoneNum1; 
    ELSEIF zoneNum1 > zoneNum2 THEN 
    SET num = zoneNum1 - zoneNum2; 
    END IF; 

    SET fare = (num * 0.20) + 1; 
    SELECT fare; 
    END LOOP the_loop; 
    END // 
    DELIMITER ; 

    CAll calculateFare(3,5); 
+0

Это выглядит странно (вы имели в виду назвать их одинаковыми?): SELECT zone, zone FROM station WHERE имя_станции = stationid1 И имя_станции = stationid2; – ethrbunny

+0

Привет, спасибо за ответ. Я пытаюсь получить зону для обеих станций «stationid1» и «stationid2», и это не позволит мне делать несколько операторов выбора. – d199224

+0

Если два значения «stationid» равны, это никогда не вернет ничего. вы ИСПОЛЬЗУете два пункта. – ethrbunny

ответ

0

Не будет ли это быть проще из вас использовали десятичные значения вместо целых чисел? Предложите, чтобы вы посмотрели: http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html

+0

Хорошая точка, спасибо, но я бы использовал ее только с моей переменной тарифа, я не вижу смысла в ней с другими моими переменными. – d199224

Смежные вопросы