Précédent   Forum du club des développeurs et IT Pro > Systèmes > Autres systèmes > Unix > Shell et commandes POSIX
Shell et commandes POSIX Vos questions sur l'utilisation des commandes shell sous Unix.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/12/2012, 16h48   #1
david2109
Invité régulier
 
Inscription : juin 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 15
Points : 9
Points : 9
Par défaut sqlplus et shell : utilisation d'un parametre et récupération dans une variable ?

Bonjour

Dans un script unix en ksh, j'ai souvent besoin d'aller interroger une table oracle via une requete SQL et lui passant un parametre et en récupérant le résultat dans une variable,

Lorsque la commande SQL est dans un fichier, pas de problème cela fonctione.

Code :
1
2
3
4
5
6
 
echo ""
echo "==== FONCTIONNE - APPEL par fichier SQL ====="
CP=3193
libCP=`sqlplus -s $ORACLE_USER @/applis/ctif/hf3/vftools/libCP.sql $CP`
echo "libCP = "$libCP
renvoie
Citation:
==== FONCTIONNE - APPEL par fichier SQL =====
libCP = AME101 - Cash Pool Elementaire

Mais du coup, je me retrouve avec beaucoup de petits fichiers SQL à gérer.

Alors pour faciliter la compréhension du script ksh, je préférerai avoir un seul fichier ksh et que ce fichier contienne les différentes requetes SQL.

Et là, ca ne marche plus

J'ai essayé trois méthodes différentes mais pas une ne fonctionne.
NOTE : bien sûr, si on enleve le parametre, ces trois méthodes fonctionnent mais sans le paramétre, cela ne m'interesse plus.

1ere méthode
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
echo ""
echo "==== 1ere METHODE - KO ====="
CP=3193
 
libCP=`sqlplus -s $ORACLE_USER <<EOF
    SET HEADING OFF
    SET ECHO OFF
    SET FEEDBACK OFF
    SET VERIFY OFF
    select lilgroup FROM TBGROUP where IDGROUP IN (&1);
    exit;
    EOF $CP`
 
echo "libCP = "$libCP
donne comme résultat

Citation:
==== 1ere METHODE - KO =====
libCP = Entrez une valeur pour 1 : select lilgroup FROM TBGROUP where IDGROUP IN ( exit CTI_REF CTI_changeDate.ksh CTI_changeIBAN.ksh CTI_runtest.ksh CTI_runtest_chantier.ksh del25.sh del25.sql files libCP.sql listeIDGROUP.sql logs prgs purge.ksh purge.sql purge_ipo.sql raz_viregul.sql temp zer.sql zer3.sql ERREUR à la ligne 1 : ORA-00911: caractère non valide SP2-0042: commande inconnue "EOF 3193" - reste de la ligne ignoré.
2eme méthode
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
echo ""
echo "==== 2eme METHODE - KO ====="
CP=3193
 
libCP=`echo "
    SET HEADING OFF
    SET ECHO OFF
    SET FEEDBACK OFF
    SET VERIFY OFF
    select lilgroup FROM TBGROUP where IDGROUP IN (&2);
    exit;
    " | sqlplus -s $ORACLE_USER $CP`
 
echo "libCP = "$libCP
a pour résultat le message de bienvenu de sqlplus

Citation:
==== 2eme METHODE - KO =====
libCP = SQL*Plus: Release 10.2.0.3.0 - Production Copyright (c) 1982, 2006, Oracle. All Rights Reserved. Syntaxe 1 : sqlplus -H | -V -H Affiche la version de SQL*Plus et l'aide sur la syntaxe. -V Affiche la version de SQL*Plus. Syntaxe 2 : sqlplus [ [<option>] [<logon>] [<start>] ] <option> : [-C <version>] [-L] [-M "<options>"] [-R <level>] [-S] -C <version> Définit la compatibilité des commandes affectées à la version spécifiée par <version>. Cette version est dotée de la syntaxe "x.y[.z]". Par exemple, -C 10.2.0 -L Ne tente de se connecter qu'une seule fois, au lieu de réafficher l'invite en cas d'erreur. -M "<options>" Définit le balisage HTML automatique de la sortie. Les options sont au format suivant : HTML [ON|OFF] [HEAD text] [BODY text] [TABLE text] [ENTMAP {ON|OFF}] [SPOOL {ON|OFF}] [PRE[FORMAT] {ON|OFF}] -R <level> Définit le mode restreint pour désactiver les commandes SQL*Plus qui interagissent avec le système de fichiers. Le niveau peut être 1, 2 ou 3. La valeur la plus restrictive est -R 3, qui désactive toutes les commandes utilisateur interagissant avec le système de fichiers. -S Définit le mode client qui supprime l'affichage de la bannière SQL*Plus, les invites et la sortie (echo) des commandes. <logon> : (<username>[/<password>][@<connect_identifier>] | /) [AS SYSDBA | AS SYSOPER] | /NOLOG Indique le nom utilisateur, le mot de passe et l'identificateur de connexion du compte de base de données pour la connexion à cette base. Sans ID de connexion, SQL*Plus se connecte à la base de données par défaut. Les options AS SYSDBA et AS SYSOPER sont des privilèges d'administration de base de données. L'option /NOLOG permet de démarrer dans SQL*Plus sans connexion à une base de données. <start> : @<URL>|<filename>[.<ext>] [<parameter> ...] Exécute le script SQL*Plus spécifié depuis un serveur Web (URL) ou le système de fichiers local (filename.ext) à l'aide des paramètres fournis, qui seront affectés aux variables de substitution du script. Lorsque SQL*Plus démarre, et après l'exécution des commandes CONNECT, le profil de site (ex. : $ORACLE_HOME/sqlplus/admin/glogin.sql) et le profil utilisateur (ex. : login.sql dans le répertoire de travail) sont exécutés. Les fichiers peuvent contenir des commandes SQL*Plus. Pour plus d'informations, reportez-vous au manuel SQL*Plus User's Guide and Reference.
3eme méthode

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
echo ""
echo "==== 3eme METHODE - KO ====="
CP=3193
 
libCP=$(sqlplus -s $ORACLE_USER<<-EOF
 
    SET HEADING OFF
    SET ECHO OFF
    SET FEEDBACK OFF
    SET VERIFY OFF
    select lilgroup FROM TBGROUP where IDGROUP IN (&1);
    $CP
    exit;
    EOF)
 
echo "libCP = "$libCP
débouche sur

Citation:
==== 3eme METHODE - KO =====
libCP = Entrez une valeur pour 1 : AME101 - Cash Pool Elementaire
Cette 3eme méthode me semble la plus proche de la vérité...Mais elle n'est pas trés élégante et plutot compliquée à gérer (bizarre, ce parametre $CP perdu dans le code SQL)
Il reste aussi à se débarrasser du libellé superflu "Entrez une valeur pour 1:"

Une idée ? (avec une préférence pour les méthodes 1 ou 2)

D'avance merci
david2109 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 11h56   #2
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 868
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 868
Points : 11 734
Points : 11 734
As-tu essayé avec :
Code sql :
SELECT lilgroup FROM TBGROUP WHERE IDGROUP IN ($CP);
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises
[code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/12/2012, 08h18   #3
david2109
Invité régulier
 
Inscription : juin 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 15
Points : 9
Points : 9
Bonjour,

Merci pour ta réponse!
Cela fonctionne
A force de chercher le détail, on ne voit plus l'évidence.

Finalement, ce post devrait s'appeler "les différentes façon d’exécuter du code dans un script"

On obtient :

1ere méthode

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
echo ""
echo "==== 1ere METHODE - OK ====="
CP=3193
 
libCP=`sqlplus -s $ORACLE_USER <<-EOF
    SET HEADING OFF
    SET ECHO OFF
    SET FEEDBACK OFF
    SET VERIFY OFF
    select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
    exit;
    EOF`
 
echo "libCP = "$libCP
2eme methode

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
echo ""
echo "==== 2eme METHODE - OK ====="
CP=3193
 
libCP=`echo "
    SET HEADING OFF
    SET ECHO OFF
    SET FEEDBACK OFF
    SET VERIFY OFF
    select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
    exit;
    " | sqlplus -s $ORACLE_USER`
 
echo "libCP = "$libCP
3eme methode

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
echo ""
echo "==== 3eme METHODE - OK ====="
CP=3193
 
libCP=$(sqlplus -s $ORACLE_USER<<-EOF
    SET HEADING OFF
    SET ECHO OFF
    SET FEEDBACK OFF
    SET VERIFY OFF
    select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
    exit;
    EOF)
 
echo "libCP = "$libCP
donne dans les 3 cas le meme résultat

Citation:
==== 1ere METHODE - OK =====
libCP = AME101 - GROUPE MADRID - Cash Pool Elementaire
david2109 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h51.


 
 
 
 
Partenaires

Hébergement Web