2009-07-16 16 views
5

これはMySQL 5.1です。MySQL:プロシージャパラメータをEXECUTE USING文に渡す

(注:私は、この特定の例を行うためのより良い方法がある実現し、これは私の本当のコードではありません)。ここ

は私が何をしたいです: 以下の手順が作成されますが、ときに私はそれを呼び出します、私は「ERROR 1210(HY000):不正な引数は、実行する」を得る

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 

EXECUTEを使用してステートメントにプロシージャのパラメータを渡す方法はありますか?ここで が実際に作業したバージョンですが、私いらだた:サイド・質問のよう

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()とquote_identのように、文字列をエスケープするためにどんな施設がありますか?基準点については

は、ここでは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 

ありがとう!

答えて

2

パラメータホルダーを二重引用符で囲む必要はありません。ここで

更新、誤解がないといけない:私はこれを行う場合は

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

は:SETの@sql = CONCATを(、状態 '状態= TEST_TABLE SELECT * FROM'); そして、それはコンパイルが、私は、私を得るそれを呼び出すとき: MySQLの> CALLのget_users_by_state( 'AA')// ERROR 1054(42S22): 'where句' に不明な列 'A' だから私は取り囲むように持っていますそれはいくつかのレベルで引用符では、それは –

+0

と思われる私はパラメータホルダーではなく、連結を持つバージョンを意味した。 'SET @sql = 'SELECT * FROM test_table WHERE state =?'; ' – ChssPly76

+1

ああ、そうだよ。私はそれをテストするだろうが、私はその例を働かせることができれば、私の質問に答えられるだろう(: –

関連する問題