2009-07-16 11 views
5

Questo è MySQL 5.1.MySQL: Passare i parametri della procedura a EXECUTE USING.

(Nota: Mi rendo conto che ci sono modi migliori di fare questo particolare esempio, questo non è il mio vero codice)

Ecco cosa voglio fare: La procedura di seguito viene creato, ma quando io lo chiamo , ottengo "ERRORE 1210 (HY000): argomenti non corretti per l'esecuzione"

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'è un modo per passare i parametri della procedura per la dichiarazione ESEGUI usando? Ecco una versione che fa davvero il lavoro, ma mi infastidisce:

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

Come un lato-domanda, non MySQL dispone di strutture per sfuggire stringhe, come Postgres' quote_literal() e quote_ident()?

Per un punto di riferimento, qui c'è qualcosa in qualche modo equivalente per 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 

Grazie!

risposta

2

Non penso che siano necessarie doppie virgolette attorno al titolare del parametro.

aggiornamento Qui, affinché non vi sia alcun equivoco:

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

Se faccio questo: SET @sql = CONCAT ('SELECT * FROM WHERE TEST_TABLE state =', stato); Poi si compila, ma quando io lo chiamo, ottengo: mysql> CALL get_users_by_state ('AA') // ERRORE 1054 (42S22): Unknown colonna 'AA' in 'where clause' Quindi devo circondare tra virgolette, ad un certo livello, sembra –

+0

intendevo la versione con il proprietario dei parametri, non la concatenazione. 'SET @sql = 'SELECT * FROM test_table WHERE state =?';' – ChssPly76

+1

Ah, capisco. Vorrei testarlo, ma se potessi ottenere quell'esempio funzionante, la mia domanda sarebbe stata risolta (: –

Problemi correlati