2010-06-20 4 views
1

Je tables dans Mysql 5 db avec des noms préfixés avec un signe de dollar « $ » -à-dire tablename MYTABLE

$ J'utilise Spring 3.0 JdbcTemplate pour faire ma requête de sélection mais ne pouvait pas le faire fonctionner.

-à-dire

String tablename = "$AAPL"; 

    private static final String STOCK_SELECT = 
    "select symbol, open, high, low, close, vol, ev from ?"; 

    jdbcTemplate.query(STOCK_SELECT, 
         new Object[] { tablename }, 
         new RowMapper() { .... }); 

Ce sera toujours jette InvalidSqlException, probablement à cause du signe $. Si je fais juste une requête normale sans param, ie.

private static final String STOCK_SELECT = 
    "select symbol, open, high, low, close, vol, ev from $AAPL"; 

Puis tout fonctionne. Comment puis-je échapper le signe $ en utilisant jdbcTemplate?

- Edition, ce que je fini par faire -

Au lieu de passer le nom de la table "AAPL $" à JdbcTemplate, je viens de créer la chaîne SQL manuellement, à savoir

jdbcTemplate.query(getStockSelect("$AAPL", .., ..)); 
+0

Comment avez-vous géré cela dans le monde? Votre solution la plus simple serait d'enlever la ponctuation de vos noms de table ... – Charles

Répondre

0

Les informations de base de données telles que les noms/identificateurs de table et de colonne ne sont pas destinées à être paramétrées. MySQL utilise le backtick (`) pour les noms/identifiants de table et de colonne. Votre requête paramétrées va probablement comme:

select symbol, open, high, low, close, vol, ev from "$AAPL" 

Je ne suis pas au courant d'une API standard pour le paramétrage/échapper à des identifiants comme ça. Je recommanderais, si vous le pouvez, de l'inclure de façon statique. Comme ce sont les mêmes colonnes, le partitionnement de la table peut également être une option. Enfin, si vous avez toujours besoin d'être dynamique, vous devrez vous échapper du nom de la table, je vous recommande de l'insérer dans une liste blanche.

Vous voudrez peut-être jeter un oeil à la mysql documentation on how to escape identifiers.

2

supports SQL identificateurs délimités afin que vous puissiez utiliser la ponctuation, les espaces, les symboles spéciaux, les caractères internationaux ou les mots-clés SQL comme noms de tables ou de colonnes.

Voir ma dernière réponse à Do different databases use different name quote?

MySQL, utilisez apostrophes:

private static final String STOCK_SELECT = 
"select symbol, open, high, low, close, vol, ev from `$AAPL`"; 

Ou réglez sql_mode en mode ANSI et utilisez des guillemets doubles:

private static final String STOCK_SELECT = 
"select symbol, open, high, low, close, vol, ev from \"$AAPL\""; 

Vous pouvez N'utilisez pas d'espace réservé ? pour un nom de table dans SQL. Ce n'est pas pris en charge par le langage. Vous pouvez utiliser un paramètre seulement où vous pouvez normalement utiliser une valeur littérale, comme un entier ou une chaîne entre guillemets simples.

Questions connexes