2010-06-17 11 views
1

INFORMIX-SQL ou tout autre DB basé sur SQL:table des variables ou les noms de colonnes

Supposons que j'ai une application où en fonction de la valeur de certaines colonnes, par exemple:

company.code char(3) {abc} 
company.branch char(2) {01} 

Puis-je construire la table nom "abc01" pour l'inclusion dans SELECT * FROM abc01; ? En d'autres termes, un nom de table variable .. même question s'applique pour les noms de colonnes.

Répondre

3

Seulement dans un langage qui peut manipuler des chaînes de caractères et gérer le SQL dynamique. Il doit créer la déclaration à la volée.

Vous pouvez uniquement utiliser des espaces réservés dans les requêtes de valeurs, et non pour les éléments structurels de la requête tels que le nom de la table ou le nom de la colonne.

+0

Est-il possible d'envoyer le nom d'une table en tant que paramètre dans une fonction et d'effectuer un SELECT? –

+0

@PaulVargas: en quelque sorte ... mais généralement pas vraiment. La fonction SQL dynamique dans les procédures stockées dans 11.70 (11.50?) Informix signifie que vous pouvez le faire. Le problème est "quel est le type de retour des données" et comment le renvoyez-vous via la procédure, qui a une signature fixe. Pour les chaînes courtes et les types numériques ou temporels, vous pouvez vous en sortir en retournant VARCHAR (255) et en laissant les conversions gérer cela; ça va marcher. Mais cela ne fonctionnera pas pour les types de données totalement arbitraires - chaînes longues, et certains types définis par l'utilisateur, etc. Donc la réponse est "Pas vraiment, mais vous pourriez essayer si vous le vouliez vraiment". –

2

Seulement si vous utilisez SQL dynamique. C'est comme si vous construisiez du code SQL dans votre application, puis utilisez quelque chose comme exécuter immédiatement.

sprintf(cdb_text1, "create table %s (field1 char(3));", usr_db_id); 
EXEC SQL execute immediate :cdb_text; 

Si vous utilisez SQL dynamique, c'est mauvais à cause des injections sql.

+1

SQL dynamique utilisé avec négligence peut certainement conduire à [Injection SQL] (http://xkcd.org/327), mais simplement en utilisant SQL dynamique n'est pas automatiquement un problème. Cela dépend de la façon dont vous êtes prudent. Cet exemple particulier n'a pas trop d'importance; avec un champ CHAR (3) et un champ CHAR (2) contenant les données de l'utilisateur, il n'y a pas beaucoup de marge de manœuvre (Ancien "Robert"), les étudiants de DROP TABLE; "ne tiennent pas dans 5 caractères. –

+0

Dans ce cas, ce n'est pas dangereux. Mais si j'utilise le SQL dynamique, j'ai besoin de savoir que cette possibilité existe, n'est-ce pas? – ksogor

+1

Si la source des valeurs dynamiques est un utilisateur, vous devez prendre en compte les implications de l'injection SQL. Si les aspects dynamiques du SQL généré sont une logique métier purement interne au programme, alors c'est une question entièrement différente, et vous n'avez qu'à considérer comment vous gérez les valeurs inattendues/NULL apparaissant dans ces colonnes. Cela dit, si vous trouvez que vous avez besoin de faire cela, vous devriez jeter un œil critique sur votre modèle de données. Tout cela semble très fragile. – RET