2009-07-16 11 views
5

Bu, MySQL 5.1'dir.MySQL: Prosedür paramlarını, EXECUTE USING ifadesine geçirme

(Not: Bu benim gerçek kodu değil bu özel örneği yapmanın daha iyi yolları vardır fark): Bunu CALL zaman Aşağıdaki prosedür oluşturulan alır, ancak

İşte

yapmak istediğim şeydir Ben "HATA 1210 (HY000): Yanlış argümanlar başaltmak için" get

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 

yürütmek KULLANMA açıklamaya yordamın parametreleri aktarmak için bir yol var mı? İşte gerçekten iş yapan bir sürüm değildir beni rahatsız ediyor: Yan soru olarak

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; 
// 

, MySQL) (PostgreS' quote_literal() ve quote_ident gibi, dizeleri kaçan için olanakların var?

referans noktası için

, burada Postgres için biraz eşdeğer şey:

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 

teşekkürler!

cevap

2

Parametre tutucusu etrafında çift tırnak işareti gerektiğini sanmıyorum. Eğer bunu yaparsam

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

:: hayır yanlış anlama söz konusu diye

İşte Güncelleme, SET @ sql = CONCAT ('test_table SELECT * FROM WHERE durum =' devlet); Sonra derler, ama bunu ARA, ben alıyorum: mysql> ÇAĞRI get_users_by_state ('AA') // HATA 1054 (42S22): 'hükmü burada' Yani var içinde Bilinmeyen sütun 'AA' çevreleyecek Bazı düzeylerde tırnak işaretleri, –

+0

görünüyor Ben parametre tutucu ile bir sürüm demek, birleştirme anlamına gelmez. 'SET @sql = 'SELECT * test_table WHERE durumundan =?';' – ChssPly76

+1

Ah, anlıyorum. Bunu test edersem, ancak bu örneği çalıştırabilirsem, soruma cevap verecektim (: –

İlgili konular