2016-10-12 3 views
1

프로 시저 위에 생성 한 테이블을 인식하지 못하고 필드 목록에 unknown table "tourstats"이라고 표시됩니다. 테이블 tourstats에는 프로 시저 호출로 데이터를 삽입하고 프로 시저 호출을 실행할 때 의도적으로 데이터가 들어 있지 않습니다. 필드 목록에 unknown table "tourstats"과 테이블 "participates"에 대해서도 동일합니다.MySQL 프로 시저가 테이블을 인식하지 못합니다

제 목표는 입력이 tour_id 인 절차를 작성하는 것입니다. 이 tour_id이 테이블 tourstats의 열 tourID에 있으면 삭제하거나 업데이트하고 그렇지 않으면 삽입합니다. 이 3 가지 마지막 작업은 프로 시저를 호출하는 3 개의 트리거를 사용하여 수행되지만 쉬운 부분입니다. 난 그냥 첫 번째 IF 절은 문제가 될 수있는 것으로 나타났습니다

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 (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

관련 문제