2016-10-12 8 views
1

Он не распознает таблицы, которые я создал выше процедуры, и он говорит: unknown table "tourstats" в списке полей. Таблица tourstats не содержит данных преднамеренно, потому что я вставляю данные с вызовом процедуры, и когда я выполняю вызов процедуры, она говорит: unknown table "tourstats" в списке полей, а также то же самое для таблицы "participates".Процедура MySQL не распознает таблицы

Моя цель - написать процедуру, согласно которой ее ввод tour_id. Если этот tour_id находится в таблице tourstats в столбце tourID, я либо удаляю его, либо обновляю, а если нет, то вставляю его. Эти 3 последних действия выполняются с использованием 3 триггеров, вызывающих процедуру, но это легкая часть.

Вот мой код:

CREATE DATABASE IF NOT EXISTS TourDB; 
     USE TourDB; 

     CREATE TABLE if not exists PARTICIPATE (
      CID SMALLINT NOT NULL, 
      TOURID VARCHAR(5) NOT NULL, 
      PAYMENT DECIMAL(9 , 2) NOT NULL, 
      PRIMARY KEY (CID , TOURID), 
      CHECK (PAYMENT > 0), 
      FOREIGN KEY (CID) 
       REFERENCES CUSTOMERS (CID) 
       ON DELETE CASCADE ON UPDATE CASCADE, 
      FOREIGN KEY (TourID) 
       REFERENCES TOURS (TourID) 
       ON DELETE RESTRICT ON UPDATE CASCADE 
     ); 

     LOAD DATA LOCAL INFILE 'C:\\.........\\participate.csv' 
     INTO TABLE participate 
     COLUMNS TERMINATED BY ';' 
     LINES TERMINATED BY '\r\n' 
     IGNORE 1 LINES; 

     CREATE TABLE TourStats (
      tourID VARCHAR(5) NOT NULL, 
      numCustomers INT NOT NULL, 
      revenue DECIMAL(9 , 2) NOT NULL, 
      PRIMARY KEY (tourID), 
      FOREIGN KEY (tourID) 
       REFERENCES Tours (tourID) 
       ON DELETE CASCADE ON UPDATE CASCADE 
     ); 



    #PROCEDURE 
    delimiter // 
    create procedure UpdateTourStats (IN tour_id varchar(10)) 

    begin 

    if (tour_id) in (tourstats.tourID) and (tour_id) = (participate.TOURID) then 
    #update 
    begin 
    update TourStats 
    set tourID = tour_id, numCustomers = count(participate.CID), revenue = sum(participate.PAYMENT); 
    end; 
    #insert 
    elseif (tour_id) not in (tourstats.tourID) and (tour_id) = (participate.TOURID) then 
    begin 
    insert into TourStats 
    values (tourid, count(participate.CID), sum(participate.PAYMENT)); 
    end; 
    #delete 
    else 
    begin 
    delete from tourstats 
    where tourstats.tourID = tour_id; 
    end; 
    end if; 

    end// 
    delimiter ; 

call UpdateTourStats ('tour2'); 
+0

Это в MySQL или MS SQL Server? – CGritton

+0

это сервер MySQL –

+0

'tourstats! = TourStats': http://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html –

ответ

0

Я просто заметил, что ваш первый IF пункт может быть проблема.

if (tour_id) in (tourstats.tourID) and (tour_id) = (participate.TOURID)

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

if tour_id in (select tourID from tourstats) 
and tour_id in (select TOURID from participate) 

Теперь вы спрашиваете, есть ли значение в наборе данных.

Ввод названия столбца непосредственно в поле IN, как представляется, работает для операторов SELECT, но когда я пытаюсь использовать его в хранимой процедуре, я получаю ту же самую ошибку, которую вы получаете. Если я перейду к синтаксису, который я предлагаю, у меня нет ошибки.

Добавление

Теперь, когда вы получаете другую ошибку, и я вижу, что вы выполняете процедуру со значением, которое вы надеетесь вставляются в таблицу, протестируем только что раздел:

if tour_id not in (select tourID from tourstats) 
and tour_id in (select TOURID from participate) then 
begin 
insert into TourStats 
select TOURID, count(CID), sum(PAYMENT) 
from participate where TOURID = tour_id 
group by TOURID; 
end; 
end if; 

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

select TOURID, count(CID), sum(PAYMENT) 
from participate where TOURID = 'tour2' 
group by TOURID; 

И если это работает, попробуйте следующее:

insert into TourStats 
#Plus the above SELECT statement# 

И как только вы, что работает, вы готовы отказаться, что в вашем SP. Удачи.

+0

Да, я пробовал, но я все равно получаю ту же проблему .. mysql нечувствителен к регистру. –

+0

все еще не работает для меня .. Я действительно не знаю, является ли это моей логикой, что это неправильно или MySQL играет со мной .. –

+0

Вы изменили все условные условия в хранимой процедуре? – CGritton