2014-04-20 36 views
5

tôi đang tạo truy vấn động trong quy trình được lưu trữ. thủ tục lưu trữ của tôi là như sau:truy vấn động mysql trong thủ tục được lưu trữ

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team=",w_team); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END 

khi tôi cố gắng chạy nó với các cuộc gọi sau đây:

call test1 ('Test','SPA'); 

tôi nhận được thông báo lỗi sau:

Error Code: 1054. Cột không xác định 'SPA' trong 'where clause'

tôi đã kiểm tra mà không có điều kiện ở đâu nd nó hoạt động tốt, nhưng với điều kiện nơi nó không hoạt động, tôi đã thử sử dụng @ với tên biến nhưng nó vẫn không hoạt động.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

4

Hãy thử như thế này:

SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'"); 

Giải thích:

truy vấn động trước sẽ như thế nào:

SELECT * FROM Test where team=SPA 

Và chúng tôi đã thay đổi nó để:

SELECT * FROM Test where team='SPA' 
+0

SET @ t1 = CONCAT ("SELECT col1 vào '@' var1 TỪ", TAB_NAME ", nơi đội = '", w_team, "'"); var1 luôn là null, tại sao vậy? – Shann

+0

@Shann: Bạn đang cố gắng làm gì? –

+0

tôi đang cố gắng để lưu trữ các col1 vào var1, tôi đặt @ in '' bởi vì tôi đã có lỗi trên stack. – Shann

6

Hãy thử điều này ..

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'"); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END 

Bạn đang thiếu dấu ngoặc kép quanh biến w_team ..

bạn nên in tuyên bố rằng động xây dựng vì vậy bạn chỉ có thể sao chép tuyên bố in và cố gắng để bạn có thể dễ dàng tìm thấy loại vấn đề.

chọn @ t1 sẽ in Statment rằng xây dựng động ..

2

Error Code: 1054. Unknown column 'SPA' trong 'mệnh đề where'

Điều này xảy ra khi bạn không kèm theo chuỗi đầu vào trong dấu ngoặc kép và công cụ SQL cố gắng xác định nó như một cột trong bảng được truy vấn. Nhưng nó thất bại vì nó không thể tìm thấy nó.

Nhưng điều gì sẽ xảy ra khi nó tìm thấy cột như vậy?
Nó tìm nạp kết quả khi tìm thấy một số kết quả phù hợp trên các giá trị cột.
Rõ ràng đây không phải là điều mong đợi.

Cách khắc phục điều này? Sử dụng các câu lệnh được chuẩn bị với các giá trị đầu vào động.

Bạn cũng có thể sử dụng trình giữ chỗ như ? trong các quy trình được lưu trữ trên các giá trị nhập động để sử dụng với Prepared Statements. Động cơ sẽ xử lý các ký tự thoát và các giá trị chuỗi khác khi được gán hoặc so sánh với trong các biểu thức SQL.

Bạn chỉ cần gán lại thủ tục nhập vào một hoặc nhiều biến phiên, theo yêu cầu.

Ví dụ về thủ tục của bạn:

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40), IN w_team VARCHAR(40)) 
BEGIN 
    SET @t1 = CONCAT('SELECT * FROM ', tab_name, ' where team = ?'); -- <-- placeholder 
    SET @w_team := w_team; 

    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3 USING @w_team; -- <-- input for placeholder 
    DEALLOCATE PREPARE stmt3; 
END; 
Các vấn đề liên quan