2013-05-01 2 views
1

여기에 내 코드동적 뷰에서 준비된 문을 사용하여

Drop procedure if exists test// 
CREATE PROCEDURE test(IN woeid VARCHAR(15)) 
    BEGIN 
    SET @w1 := woeid; 
SET @sql = CONCAT('CREATE OR REPLACE VIEW temp 
        AS 
        SELECT * 
        FROM test_table gp 
        WHERE gp.name =', @w1); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END// 
Delimiter ; 

call test('ABCD'); 

내가 오류 코드와 오류가 점점 오전 :에 1054 알 수없는 열 'ABCD'를 '어디에'조항

도와주세요.

+0

을 ?? gp.name은 사용자 정의가 필요합니다. – Neil

+0

동적 뷰를 사용하기 때문에 준비 문을 사용해야합니다. – Neil

답변

3

다른 접근 방식이 더 적절할 때 불필요하게보기를 사용하는 것처럼 들립니다.

그러나 작동하지 않는 이유는 문자열 리터럴을 인용하지 않았기 때문에 결과로 나온 SQL에 WHERE gp.name = ABCD이 포함되어 있고 적어도 최소한 WHERE gp.name = 'ABCD' 일 필요가 있습니다. 당신은 이 목적을 위해 MySQL을의 QUOTE() 기능을 사용할 수 있지만 값의 파라미터를하는 것이 좋습니다 : 옵션은 무엇 @eggyal

DELIMITER // 
DROP PROCEDURE IF EXISTS test// 
CREATE PROCEDURE test(IN woeid VARCHAR(15)) 
BEGIN 
    SET @w1:=woeid, @sql:=CONCAT(' 
    CREATE OR REPLACE VIEW temp AS 
     SELECT * 
     FROM test_table 
     WHERE name = ? 
    '); 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt USING @w1; 
    DEALLOCATE PREPARE stmt; 
    SET @w1:=NULL, @sql:=NULL; 
END// 
DELIMITER ; 

CALL test('ABCD'); 
+0

뷰의 선택에 변수 또는 매개 변수를 포함 할 수 없으므로 사용할 수 없습니다. ERROR 1351 – Neil

+0

. 내 업데이트 답변을 참조하십시오. – eggyal

+0

굉장합니다. 그것은 효과가 있었다. 내가 볼 수 있듯이 QUOTES에 문제가있었습니다. 문제가 무엇인지 설명해 주시겠습니까? – Neil

관련 문제