Publié le 29 Janvier 2010

J'ai souvent besoin d'effectuer des requêtes SQL depuis un script shell pour récupérer ou modifier des données en base.
Voici donc coment intérroger facilement une base Oracle depuis un script shell grâce à l'outil SQL*Plus (sqlplus).

Le principe est simple on appelle sqlplus en lui donnant dans le flux d'entrée standard la requête SQL à exécuter.

On peut également rediriger le flux de sortie vers un fichier de log comme dans l'exemple.
Si on veut faire un SELECT et afficher les résultats alors on évitera de rediriger la sortie standard.

Voilà ce que ça donne:

sqlplus -L <username>/<password>@<database> > oracle.log << EOF
 insert into MOTS_CLES (
   SITE,
   MOTCLE
 )
 values(
   'patatos.over-blog.com',
   'sqlplus'
 );
 commit;
 exit;
EOF

Voir les commentaires

Rédigé par Dams

Publié dans #Oracle

Repost 0

Publié le 28 Janvier 2010

Comment connaitre la longueur d'une chaine dans un script ?

Rien de plus facile imaginons que votre chaine se trouve dans une variable (ce qui est généralement le cas):

MA_CHAINE="Je voudrais bien connaitre le nombre de caracteres de cette chaine"

Pour obtenir la longueur il suffit de faire:

LONGUEUR=${#MA_CHAINE}

Et voilà, plus qu'à afficher le résultat pour finir:

echo "MA_CHAINE contient $LONGUEUR caracteres"

ce qui donne:

MA_CHAINE contient 66 caracteres

Voir les commentaires

Rédigé par Dams

Publié dans #Script

Repost 0

Publié le 28 Janvier 2010

Voilà une petite astuce qui permet de détecter si le script est exécuté dans un environnement windows ou pas.

Le principe est le suivant:

On utilise la commande "uname" qui permet d'obtenir des informations système.
Sous Windows (avec Cygwin) on obtient par exemple:

CYGWIN_NT-5.1

Ensuite dans le script on a plus qu'à vérifier si la réponse contient la chaine "_NT", ce qui donne le script suivant:

if [ -n $(expr $(uname) : '*.\(_NT\).*') ]
then
   # environnement WINDOWS
else
   # autre environnement (UNIX/LINUX par ex)
fi

l'option "-n" retourne true si la chaine n'est pas vide (si elle contient _NT, dans ce cas-ci)
"expr" permet de tester si la chaine retournée par "uname" contient "_NT"

et le tour est joué

Voir les commentaires

Rédigé par Dams

Publié dans #Script

Repost 0

Publié le 27 Janvier 2010

Pour executer une commande shell sans avoir de message d'erreur (ou de message de pas d'erreur) il suffit de rediriger les flux de sorties dans /dev/null.
Ce qui s'ecrit comme suit:

1> /dev/null 2>/dev/null

ou plus succintement

> /dev/null 2>&1

Redirection du flux standard (1) dans /dev/null et redirection du flux d'erreur (2) dans le flux standard (1) soit dans /dev/null.

Par exemple

rm fichier >/dev/null 2>&1

Voir les commentaires

Rédigé par damien

Publié dans #Script

Repost 0

Publié le 27 Janvier 2010

Je ne sais pas si c'est votre cas mais j'ai parfois du mal a retenir toutes les expressions de test qu'on peut utiliser dans les script shell (ksh notamment).

Des trucs du genre :

if [ -a fichier1.txt ]

J'ai donc décider de faire une liste que je compléterai à l'occasion:

-a <fichier> true si le fichier existe
-d <fichier> true si le fichier est en fait un répertoire
-f <fichier> true si le fichier existe et s'il s'agit d'un fichier régulier
-L <fichier> true si le fichier existe et si c'est un lien symbolique
-n <string> true si la chaine n'est pas vide
-r <fichier> true si le fichier existe et s'il est accessible en lecture
-s <fichier> true si le fichier existe et s'il a une taille non nulle
-w <fichier> true si le fichier existe et s'il est accessible en écriture
-x <fichier> true si le fichier existe et s'il est exécutable
-z <string> true si la chaine est vide

Voir les commentaires

Rédigé par damien

Publié dans #Script

Repost 0

Publié le 27 Janvier 2010

Et oui deuxième article sur SQL*Loader et déjà premier problème.

Juste après avoir exécuter sqlldr comme je vous l'expliquais précédemment, je me retrouve avec une magnifique erreur ORA-01502 et plus possible d'effectuer un simple SELECT sur la table MOTS_CLES.

En fait la raison est simple (mais c'était pas si évident à trouver, si si):

Si vous avez remarqué je récupère que les 10 premiers caractères de chaque mot-clé qui se trouve dans le fichier texte. Et du coup il y a eu des doublons lors de l'insertion des données.

Et comme on utilise le mode direct (option direct=true) sqlldr écrit directement dans les fichiers de la base sans vérifier les contraintes comme l'unicité de la clé publique. Du coup quand il a fini et qu'il essaie de reconstruire l'index et ben boum!! c'est tout cassé!

Donc attention au doublons en mode direct!!

Ce problème est très bien expliquer ici: http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96652/ch09.htm#1007759

Voir les commentaires

Rédigé par damien

Publié dans #Oracle

Repost 0

Publié le 27 Janvier 2010

SQL*Loader est un utilitaire Oracle qui permet d'insérer directement des données en base sans passé par les requêtes SQL "INSERT INTO ...".

Ceci a plusieurs avantages car on peut charger des fichiers textes contenant les valeurs et le gain de temps est conséquent. Ces principalement ces deux avantages qui ont retenus mon choix sur cet outil.

Maintenant pour le fonctionnement:

C'est pas très compliqué (au début en tout cas).

SQL*Loader (sqlldr) a besoin de 2 fichiers pour travailler:
 - le fichier contenant les données à insérer bien sûr
 - un fichier de control expliquant à sqlldr comment se présentent les données dans le fichier texte et où les insérer dans la base.

Le fichier texte n'a pas besoin de respecter un format spécifique étant donné que sa structure est décrite dans le fichier de controle.

Dans mon cas je veux remplir une table avec les valeurs qui se trouvent dans mon fichier texte.

La table que je dois remlir contient 2 colonnes:
site mot-clé
le nom du site la liste des mots clé contenu dans le site

Ce qui donne par exemple:
site mot-clé
pointzero.over-blog.com SQL
pointzero.over-blog.com Oracle
pointzero.over-blog.com sqlldr

Le fichier qui contient les données ressemble à ça:

SQL
Oracle
sqlldr
...

Donc il faut créer un fichier de contrôle qui prend le mot clé dans le fichier texte et qui insère le nom du site (pointzero.over-blog.com):

load data
append
into table MOTS_CLES
(
    SITE CONSTANT 'pointzero.over-blog.com',
    MOTCLE POSITION(01:10) char,
)


Ce fichier effectue un "append" (rajoute) des données dans la table MOTS_CLES.
Il insère toujours la constante 'pointzero.over-blog.com' dans la colonne SITE et les 10 premiers caractère du mot clé qui se trouve le fichier texte dans le colonne MOTCLE.

Voilà tout est prêt il n'y a plus qu'à lancer la commande:

sqlldr userid=${USER}/${PASSWORD}@${DATABASE} \
  control=motscles.ctl \
  direct=true \
  readsize=1000 \
  bindsize=1000 \
  rows=1000 \
  errors=0 \
  log=motscles.log \
  bad=motscles.bad \
  discard=motscles.dsc \
  data=motscles.txt

Voir les commentaires

Rédigé par damien

Publié dans #Oracle

Repost 0

Publié le 27 Janvier 2010

Ceci est le premier article sur patatos.over-blog.com. Et comme il se doit lors d'une inauguration je vais souhaiter plein de bonne chose à ce nouveau blog:

 - de nombreux messages

 - de nombreux visiteurs

 - de nombreux commentaires

 - plein d'infos

 - un peu d'humour, de temps en temps

 - mais aussi des trucs sérieux (c'est le but quand même)

 - etc

 

Mais au fait à quoi ça sert ce blog ?

 

Ben c'est juste un endroit où je poste des problèmes (et des solutions qui vont avec bien sûr), des sujets (plus ou moins intéressant) que je rencontre dans ma vie trèpidente d'ingénieur en SSII.

 

Donc oui ça s'annonce plutôt technique mais ça peut aider parfois ... donc voilà j'espère surtout que ce blog sera utile (un peu...)

Voir les commentaires

Rédigé par damien

Repost 0