2012-08-29 65 views
1

我有表的表和行像下面在創建動態查詢存儲過程的MySQL

CREATE TABLE Areas(AreaName VARCHAR(255), 
        PinCode VARCHAR(255)) 

INSERT INTO Areas(AreaName, PinCode) 
     VALUES('Teynampet', '6000018'), 
      ('Ramapuram', '6000089'), 
      ('TNagar', '6000017'), 
      ('Mylapore', '6000014'), 
      ('Gopalapuram', '6000087') 

我寫了一個SQL過程如下

DROP PROCEDURE IF EXISTS mp_test; 
CREATE PROCEDURE mp_test(IN pArea VARCHAR(255)) 
    BEGIN 
     SET @Query = 'SELECT PinCode FROM Areas'; 

     IF pArea != '' 
     THEN 
     SET @City = CONCAT(' WHERE AreaName = ', pArea); 
     END IF; 

     SET @Query = CONCAT(@Query, @City); 

PREPARE stmt FROM @Query; 
EXECUTE stmt; 
END 

當我打電話給程序

CALL mp_test('Teynampet'); 

當我執行我沒有得到期望的結果即是600018

如何建立動態查詢在SP

感謝您的幫助

回答

2

你串接pArea參數到SQL不帶引號的。也就是說,@Query,你準備好執行的內容是:

SELECT PinCode FROM Areas WHERE AreaName = Teynampet 

由於Teynampet是帶引號的,它被解析爲(n個未知)SQL標識符,而不是一個字符串。你應該:

  • 報價在你的SQL:

    SET @City = CONCAT(' WHERE AreaName = ', QUOTE(pArea)); 
    
  • 它傳遞給準備好的語句作爲參數:

    SET @City = CONCAT(' WHERE AreaName = ?'); 
    SET @param = pArea; 
    

    然後:

    EXECUTE stmt USING @param; 
    

但是,爲什麼在這裏使用準備好的語句?你的程序可以改寫爲一個簡單的SELECT(這引發了是否需要使用存儲過程在所有的問題):

CREATE PROCEDURE mp_test(IN pArea VARCHAR(255)) 
    SELECT PinCode FROM Areas WHERE pArea IN (AreaName, ''); 

(請注意,我建議你使用NULL,而不是空字符串''在這種情況下,上述測試將是pArea IS NULL OR pArea = AreaName)。

+0

感謝您的回覆我將使用Null – user1093513