2010-02-25 12 views
2

Je souhaite exécuter des instructions select ad hoc dans l'outil IBM System I Navigator pour DB2 à l'aide d'une variable que je déclare .DB2 - Comment exécuter une requête select ad hoc avec un paramètre dans l'interface graphique IBM System i Access pour Windows Outil

Par exemple, dans le monde SQL Server je le faire facilement dans la fenêtre de requête SQL Server Management Studio comme ceci:

DECLARE @VariableName varchar(50); 
SET @VariableName = 'blah blah'; 

select * from TableName where Column = @VariableName; 

Comment puis-je faire quelque chose de semblable dans l'outil IBM System i Navigator?

+0

Jusqu'à i 7.1, iNav n'a pas de capacité « variable ». Mais il ne devrait pas y en avoir besoin de toute façon. Si vous pouvez taper une instruction DECLARE et un nom de variable et sa valeur, vous pouvez également taper (ou coller ou trouver/remplacer) la valeur dans une instruction ad hoc. Pourquoi une variable serait-elle nécessaire? (Mais notez que j'en ai voulu un de temps en temps, je m'intéresse plus aux raisons pour lesquelles d'autres le veulent.) – user2338816

+0

Une des raisons pourrait être que si vous avez une requête qui fait référence à une variable plus d'une fois, vous ne voudrez peut-être pas répéter vous-même en collant la valeur à plusieurs reprises. –

+0

Compris, bien que ce soit lorsque Find/Replace (all) serait utilisé. Cela coûte quelques clics de souris supplémentaires. – user2338816

Répondre

5

J'ai couru à travers ce post en cherchant la même question. Mon collègue a fourni la réponse. Il est en effet possible de déclarer des variables dans une instruction SQL ad hoc dans Navigator. Voici comment cela se fait:

CREATE OR REPLACE VARIABLE variableName VARCHAR(50); 
SET variableName = 'blah'; 
SELECT * FROM table WHERE column = variableName; 
DROP VARIABLE variableName; 

Si vous ne laissez pas tomber le nom de la variable, il se bloque autour jusqu'à qui sait quand ...

+1

Etat SQL: 42601 Fournisseur Code: -104 Message: [SQL0104] Le jeton OU n'était pas valide – ajeh

+0

Doit utiliser une ancienne version .. Le support CREATE OU REPLACE a été ajouté à la version 7.1, tout comme le support pour les variables globales – Charles

+0

J'ai dû spécifier un schéma pour créer la variable dans ... 'CREER OU REMPLACER VARIABLE schema.variable DECIMAL (8,0);' ... et 'SET schema.variable = 20170721;' – Dave

1

En ce moment, nous travaillons sur le même problème au travail. Malheureusement, nous avons conclu que ce n'est pas possible. Je suis d'accord, ce serait génial, mais ça ne marche pas comme ça. iNavigator ne prend pas en charge SET ou Define. Vous pouvez le faire en Embedded SQL mais ce n'est pas du SQL embarqué. Même si vous créez un document séparé (xxx.sql), vous devez ouvrir ce document pour exécuter le script, ce qui en fait un script interactif (c'est-à-dire que DECLARE SECTION n'est pas autorisé). Par ailleurs, dans l'écran/script SQL, vous pouvez utiliser CL:. Tout ce qui suit ce préfixe est exécuté en tant que commande CL. Vous pouvez manipuler vos tables (par exemple, RNMF) de cette façon. En second lieu, l'iSeries prend en charge les scripts Rexx (installés par défaut avec le système d'exploitation). Rexx est un bon langage de script dynamique et supporte le SQL embarqué. Je l'ai fait beaucoup de fois et cela fonctionne très bien. J'ai même créé des scripts pour notre environnement de production. Créez simplement un script 'default' avec un exemple d'instruction PREPARE et CURSOR et copiez-le à volonté. Avec ce script, vous pouvez jouer. Voir le manuel de Rexx pour la syntaxe correcte d'exec-sql. En outre, vous avez STDIN et STDOUT mais vous pouvez utiliser 'OVRDBF' pour pointer vers une table de base de données (fichier physique). Faites-moi savoir si vous avez besoin d'un exemple de script Rexx.

Notez que le manuel "SQL Embedded Programming" a des exemples Rexx.

+0

Hmmmmm ... pas la réponse que j'espérais! : ( "Y a-t-il quelqu'un d'autre là-bas à qui parler?" (Monty Python et le Saint Graal (1975) –

+0

Si la situation se résout bien, alors que ça va ... (mais si "ad hoc sql + variables "est la chose dont vous avez besoin, vous devriez vraiment essayer Rexx.N'oubliez pas qu'il est interprété.Ainsi, même avec sql embarqué: modifier votre source, enregistrer et exécuter.Il fonctionne comme un charme) – robertnl

0

Voici quelques autres alternatives.

Outil de transfert de données - Vous pouvez exécuter l'outil de transfert de données iSeries à partir de la ligne de commande (RTOPCB). Commencez par exécuter la version de l'interface graphique et créez un fichier de définition. Si vous éditez ce fichier avec un éditeur de texte, vous verrez que c'est juste un fichier INI démodé et vous pouvez facilement trouver la ligne avec la requête dedans. À partir de là, vous pouvez écrire un fichier batch ou pré-traiter le fichier texte pour vous permettre de manipuler la requête avant de la soumettre à l'outil de requête. QSHELL - Si vous pouvez vous connecter interactivement à l'iSeries, vous pouvez trouver l'environnement QSHELL plus familier que CL ou REXX (bien que REXX soit plutôt amusant). QSHELL est un environnement POSIX complet fonctionnant sur l'iSeries. Utilisez la commande STRQSH pour démarrer QSHELL. Vous pouvez avoir ksh ou csh en tant que shell. Dans QSHELL, il y a une commande appelée "db2" qui soumet des requêtes. Donc, vous devriez être en mesure de faire quelque chose comme ça à l'intérieur QSHELL:

system> VariableName = 'blah blah' 
system> db2 "select * from TableName where Column = \'$VariableName\'" 

Vous pourriez avoir à jouer avec les citations pour obtenir ksh de les transmettre correctement.

De même, dans QSHELL, vous devriez avoir une installation complète de Perl qui vous permettra d'utiliser DBI pour obtenir des données. D'autres façons d'interagir avec les données sur l'iSeries: requête du client avec Python via ODBC; requête du client avec Jython via JDBC; Installez Jython directement sur l'iSeries, puis interrogez via JDBC.