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!
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 –
intendevo la versione con il proprietario dei parametri, non la concatenazione. 'SET @sql = 'SELECT * FROM test_table WHERE state =?';' – ChssPly76
Ah, capisco. Vorrei testarlo, ma se potessi ottenere quell'esempio funzionante, la mia domanda sarebbe stata risolta (: –