2009-07-16 14 views
5

Đây là MySQL 5.1.MySQL: Thông số quy trình truyền để thực hiện câu lệnh USIT

(Lưu ý: Tôi nhận ra có những cách tốt hơn để làm ví dụ cụ thể này, đây không phải là mã thực của tôi)

Dưới đây là những gì tôi muốn làm: Thủ tục dưới đây được tạo ra, nhưng khi tôi gọi nó là , tôi nhận được "ERROR 1210 (HY000): đối số không đúng với EXECUTE"

DELIMITER // 
CREATE PROCEDURE get_users_by_state(IN state CHAR(2)) 
READS SQL DATA 
BEGIN 
SET @mystate = state; 
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = "?"'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt USING @mystate; 
END; 
// 

CALL get_users_by_state('AA')// 
ERROR 1210 (HY000): Incorrect arguments to EXECUTE 

có cách nào để vượt qua các thông số của thủ tục để báo cáo kết quả EXECUTE SỬ DỤNG? Đây là một phiên bản mà thực sự làm việc, nhưng irks tôi:

CREATE PROCEDURE get_users_by_state(IN state CHAR(2)) 
READS SQL DATA 
BEGIN 
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = "', state, '"') 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
END; 
// 

Là một phụ câu hỏi, không MySQL có bất kỳ cơ sở vật chất cho thoát chuỗi, như quote_literal Postgres'() và quote_ident()?

Đối với một điểm tham khảo, đây là một cái gì đó hơi tương đương cho Postgres:

CREATE OR REPLACE FUNCTION get_info_by_state(character) 
    RETURNS SETOF ret_type AS 
$BODY$ 
DECLARE 
    sql text; 
BEGIN 
    sql := 'SELECT uid, some_data FROM test_table WHERE state = ' || quote_literal($1); 
    RETURN QUERY EXECUTE sql; 
END 
$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE 

Cảm ơn!

Trả lời

2

Tôi không nghĩ rằng bạn cần dấu ngoặc kép xung quanh trình giữ thông số.

Cập nhật Ở đây, kẻo sẽ không có sự hiểu lầm:

DELIMITER // 
CREATE PROCEDURE get_users_by_state(IN state CHAR(2)) 
READS SQL DATA 
BEGIN 
SET @mystate = state; 
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = ?'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt USING @mystate; 
END; 
// 
+0

Nếu tôi làm điều này: SET @sql = CONCAT ('SELECT * FROM test_table ĐÂU state =', nhà nước); Sau đó, nó biên dịch, nhưng khi tôi GỌI, tôi nhận được: mysql GỌI get_users_by_state ('AA') // LRI 1054 (42S22): Cột không xác định 'AA' trong 'khoản' Vì vậy, tôi phải bao quanh nó trong dấu ngoặc kép ở một mức độ nào đó, có vẻ như là –

+0

Tôi có nghĩa là phiên bản với người giữ tham số, không phải là sự nối. 'SET @sql = 'SELECT * FROM test_table WHERE state =?';' – ChssPly76

+1

Ah, tôi hiểu rồi. Tôi sẽ kiểm tra nó, nhưng nếu tôi có thể nhận được ví dụ đó làm việc, câu hỏi của tôi sẽ được trả lời (: –

Các vấn đề liên quan