2016-08-30 11 views
0

아래 코드는 create table 문없이 완벽하게 작동합니다. 오류를 찾기 위해이 간단한 코드를 한시간 보았습니다.create table 문을 사용한 MySQL 프로 시저 구문 오류

DELIMITER $$ 

    USE `operations`$$ 

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$ 

    CREATE PROCEDURE `rc_pending_data_tat_proc`() 
    BEGIN 
    (
    CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/ 

    SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer, 
    (CASE 
    WHEN DATEDIFF(criteria_date,transaction_date)<=50 
    THEN '<=50' 
    WHEN DATEDIFF(criteria_date,transaction_date) <=70 
    THEN '<=70' 
    WHEN DATEDIFF(criteria_date,transaction_date) <=80 
    THEN '<=80' 
    WHEN DATEDIFF(criteria_date,transaction_date) <=90 
    THEN '<=90' 
    ELSE 
    '>90' 
    END) AS Pending_since 
    , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date` 
     FROM `rc_pending_data` a 
     LEFT JOIN `rc_store_retailer_mapping` b 
     ON a.retailer=b.store_name 
    GROUP BY 1,2 
    ); 
     END$$ 

    DELIMITER ; 

이주는 오류가 꽤 표준 하나 즉

오류 코드 : 1064 당신은 당신의 SQL 구문에 오류가 있습니다 ; 근처 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 라인에서 4

답변

1

하십시오

이 경우

, 당신은이 줄을 제거해야합니다뒤에 "("후 BEGIN 및 ")"제거하십시오.210 GROUP BY 1,스토어드 프로 시저의 일부. 나는 시작과 끝 괄호없이 이것을 시도하고 그것은 나를 위해 일했다.

+0

안녕하세요, Nitin, 도움에 감사드립니다. 히트로 오류를 좋아하고 방법을 시도해보십시오! –

0

그것은 보이는 '테이블 rc_pending_tat_temp SELECT IF를 만듭니다 (b.retailer는 NULL, a.retailer, b.ret은' 나처럼 SQL 쿼리가 빈 테이블을 만들려고한다는 사실을 좋아하지 않는다.

나는 열을 전혀 사용하지 않고 테이블을 생성 할 수 있는지 알아보기 위해 인터넷 검색을 시도했다. 특정 이유로 빈 테이블을 만들려는 경우 다른 문제인 것처럼 보이지만이 문제를 해결하려면 테이블에 열을 하나 이상 추가하십시오.

CREATE TABLE rc_pending_tat_temp(Id INT); 

이렇게하면 쿼리가 실행됩니다.

편집 : 당신이 당신의 SELECT 문의 결과를 저장할 새 테이블을 만들려면 같은

는 소리. 이를 수행하려면 SELECT INTOhere의 구문을 확인하십시오. 그러면 SELECT 성명의 결과로 표를 만들 수 있습니다. 추가 후

CREATE TABLE rc_pending_tat_temp 

그리고 :

INTO rc_pending_tat_temp 

그래서 쿼리는 다음과 같이보고 끝낼해야합니다

DELIMITER $$ 

    USE `operations`$$ 

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$ 

    CREATE PROCEDURE `rc_pending_data_tat_proc`() 
    BEGIN 
    (
     SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer, 
     (CASE 
     WHEN DATEDIFF(criteria_date,transaction_date)<=50 
     THEN '<=50' 
     WHEN DATEDIFF(criteria_date,transaction_date) <=70 
     THEN '<=70' 
     WHEN DATEDIFF(criteria_date,transaction_date) <=80 
     THEN '<=80' 
     WHEN DATEDIFF(criteria_date,transaction_date) <=90 
     THEN '<=90' 
     ELSE 
     '>90' 
     END) AS Pending_since 
    , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date` 
     INTO rc_pending_tat_temp 
     FROM `rc_pending_data` a 
     LEFT JOIN `rc_store_retailer_mapping` b 
     ON a.retailer=b.store_name 
     GROUP BY 1,2 
    ); 
    END$$ 

DELIMITER ; 
+0

안녕하세요. Malcom, create table 문 아래에서 사용되는 select 문을 통해 표에 열을 추가하고 있습니다. 나는이 오류 뒤에있는 이유를 짐작할 수 없다. –

+0

@RahulChawla SELECT INTO 구문을 찾는 것처럼 보입니다. 이 링크를 확인하십시오. [link] (http://www.w3schools.com/sql/sql_select_into.asp) 예를 들어이 답변에 대한 별도의 예를 추가하겠습니다. –

0

안녕하세요. 이전의 좋은 방법으로 문제를 발견하고 그 방법을 시도해 보았습니다. 추가 브래킷이 구문 오류를 일으키는 것으로 나타났습니다. 그것들을 제거하고 코드가 매력처럼 작동했습니다!

DELIMITER $$ 

    USE `operations`$$ 

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$ 

    CREATE PROCEDURE `rc_pending_data_tat_proc`() 
    BEGIN 
    (
    CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/ 

    SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer, 
    (CASE 
    WHEN DATEDIFF(criteria_date,transaction_date)<=50 
    THEN '<=50' 
    WHEN DATEDIFF(criteria_date,transaction_date) <=70 
    THEN '<=70' 
    WHEN DATEDIFF(criteria_date,transaction_date) <=80 
    THEN '<=80' 
    WHEN DATEDIFF(criteria_date,transaction_date) <=90 
    THEN '<=90' 
    ELSE 
    '>90' 
    END) AS Pending_since 
    , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date` 
     FROM `rc_pending_data` a 
     LEFT JOIN `rc_store_retailer_mapping` b 
     ON a.retailer=b.store_name 
    GROUP BY 1,2 
    ); 
     END$$ 

    DELIMITER ;