2009-12-27 3 views
0

avecComment obtenir une liste avec tous les mots réservés dans SQL :: Parser?

#!/usr/bin/perl 
use warnings; 
use strict; 
use 5.010; 
use SQL::Parser;         

my $parser = SQL::Parser->new('ANSI', {RaiseError=>1}); 

my $word = 'BETWEEN'; 

my $success = $parser->feature('reserved_words', $word); 
$success = $success ? '' : 'NOT'; 
say "$word is $success a reserved word"; 

Je peux vérifier si un mot est un mot réservé.

Y at-il une fonction qui me donne une liste de tous les mots réservés?

+3

Il pourrait être plus facile d'échapper à des mots réservés plutôt que de les éviter, si c'est votre but. Bien qu'il existe une liste de mots réservés dans SQL, différentes bases de données réserveront des mots supplémentaires et cela changera même entre les versions. Il est donc difficile de fournir une liste définitive. – Schwern

Répondre

7

SQL::Dialects::ANSI est une interface simple aux informations sur ANSI SQL au format INI. Donc, vous obtenez cela et l'analyser ... sauf son pas au format INI, car il ne contient pas key = value mais juste key qui étouffe Config::INI. Hélas, c'est l'un des rares parseurs d'INI que je pourrais trouver pour traiter une chaîne.

Vous devrez peut-être l'analyser à la main. C'est ce que fait SQL :: Parser.

Vous pouvez également extraire la liste des composants SQL :: Parser.

use Data::Dumper; 
use SQL::Parser; 

my $s = SQL::Parser->new; 
print Dumper $s->{opts}{reserved_words}; 

Ceci est un hack et finira par échouer.

Selon mes commentaires ci-dessus, la liste des mots réservés SQL ANSI (hey, quelle version de ANSI SQL?) N'est pas définitive. La base de données elle-même peut réserver des mots supplémentaires. Et différentes versions peuvent réserver des mots différents. Si vous pouvez trouver un moyen de faire ce que vous faites qui ne repose pas sur une liste de mots réservés, faites-le.

+0

Mes scripts ne dépendent pas de la liste. C'est pour avoir une idée de l'apparence de cette liste. J'ai essayé avant d'écrire et de tester une liste avec tous les mots qui viennent à l'esprit. Mais maintenant j'ai vu que ma liste n'était pas complète. J'ai trouvé SQL :: ReservedWords avec environ 100 mots de plus, dont un seul résultat (END-EXEC) est un mot réservé dans mon cas. Dans quel cas SQL :: ReservedWords serait-il la bonne chose? –

+0

Oh, eh bien, dans ce cas, lisez la norme. – Schwern

2

Michael m'a donné cette page RT.

Que diriez-vous d'une méthode de SQL :: Parser qui retourne toutes les caractéristiques d'une classe donnée (par exemple 'features ($)'), analogue à feature()? Cela vous aiderait-il? Si oui, veuillez ouvrir une demande de fonctionnalité sur CPAN par rapport à SQL :: Statement.

Je ne casserais pas les interfaces de travail sur lesquelles les autres s'appuient sans raison valable - la fonctionnalité manquante n'est pas une bonne raison.

+0

Merci d'avoir posté; ce n'est pas si important pour moi. S'il vous plaît voir mon commentaire ci-dessus. –

1

Si vous ne le voulez pas par programmation, ignorez tout ce que je viens de dire à propos de SQL :: Dialectes et read the standard. Vérifiez toujours la norme car les travaux dérivés peuvent être incomplets, incorrects ou travailler des dialectes. Même s'il existe des normes SQL ANSI mises à jour, la plupart des bases de données utilisent une mutation de SQL-92 ou des éléments de SQL:1999. Après ça, ils sont devenus idiots.

Je ne trouve pas de copie de la norme SQL: 1999, mais here's a BNF qui semble très complète.

Questions connexes