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.
renvoie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
==== 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
donne comme résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
2eme méthode==== 1ere METHODE - KO =====
libCP = Entrez une valeur pour 1 : select lilgroup FROM TBGROUP where IDGROUP IN ( exitCTI_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é.
a pour résultat le message de bienvenu de sqlplus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
3eme méthode==== 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.
débouche sur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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)==== 3eme METHODE - KO =====
libCP = Entrez une valeur pour 1 : AME101 - Cash Pool Elementaire
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
Partager