AppleScript et Oracle pour Macintosh OS X
Affichage dans un dialogue du résultat d’une requête, déclenchée par SQL*Plus

RCI Informatique, Avril 2004

1 - Objectif

On souhaite partir d’une requête, stockée sous forme de variable AppleScript, se connecter à la base Oracle, lancer cette requête, et afficher le résultat, dans un dialogue AppleScript, en masquant complètement l’application “Terminal”.


2 - Donnée fournie et résultat obtenu

La donnée, c’est le texte (SQL) d’une requête :

select ename, job, sal from emp

Le résultat est obtenu dans un dialogue AppleScript :






3 - Techniques utilisées

SQL*Plus, via l’application Terminal, va continuer à être utilisé, mais en arrière plan.

On va mettre en oeuvre la capacité de SQL*Plus à écrire dans un fichier texte, le résultat, formaté, d’une requête.

On attendra que SQL*Plus ait complètement terminé la création du fichier résultat, en utilisant une synchronisation par la présence d’un fichier dans le répertoire de résultat.

Enfin on utilisera la capacité du langage AppleScript à lire le contenu de fichiers.


4 - Le texte AppleScript

-- Déclenchement d'une requête SQL simple avec Oracle 9i pour Macintosh OS X
-- sous forme d'un script Apple Script destiné à contrôler SQL*Plus
-- Ecriture du résultat de la requête dans une boîte de dialogue AppleScript

-- Copyright, tous droits réservés, RCI Informatique SA, 2004
-- www.rci-informatique.fr
-- www.index-informatique.net


-- Définition et initialisation d'une variable globale

global wT
set wT to ""

-- Positionnement dans le répertoire DBCreate
e("cd /Users/oracle/9iR2/orahome/DBCreate")

-- Activation des variables d'environnement Oracle
e(". DBENV")

-- Lancement de SQL Plus en se connectant avec SQL*Net TCP/IP
-- la commande à lancer est la suivante :
-- sqplus "scott/tiger@abmacipc"

e("sqlplus \"scott/tiger@abmacipc\"")

-- Effacement du fichier de sortie et du fichier de synchronisation
EffaceFichier("resultat_02.lst")
EffaceFichier("fin.lst")

-- Définition du format de sortie de SQL*Plus
e("SET NEWPAGE 0")
e("SET SPACE 0")
e("SET LINESIZE 80")
e("SET PAGESIZE 0")
e("SET ECHO OFF")
e("SET FEEDBACK OFF")
e("SET HEADING OFF")

-- Définition de l'écriture dans un fichier "Spool" nommé resultat_02.lst
e("SPOOL /Users/temp/resultat_02")


-- lancement d'une requête renvoyant trois colonnes
e("select ename, job, sal from emp;")

-- Définition de l'écriture dans un fichier "Spool" nommé fin.lst
-- L'apparition de ce fichier nommé fin.lst permettra de savoir, depuis AppleScript, que le traitement
-- est terminé dans SQL*Plus

e("SPOOL off") -- fin du Spool SQL*Plus
e("SPOOL /Users/temp/fin")


-- Puis on quitte SQL Plus
e("exit")


-- Déclenchement de la suite de commandes Unix, en mode synchrone
doUnix(wT)

-- Synchronisation avec les commandes Unix, par attente de la présence du fichier "fin.lst"
AttenteFinSqlPlus()


-- Lecture du fichier résultat
set w to LireFichier("resultat_02.lst")

-- Affichage dans une boîte de dialogue
display dialog w

-- on quitte l'application Terminal
QuitterTerminal()


-- Définition de la procédure d'envoi à Unix d'une ou plusieurs commandes
-- contenues dans la chaîne de caractères x
on doUnix(x)
tell application "Terminal"
do script x
end tell
end doUnix


-- Constitution d'une suite de commandes séparées par des retours à la ligne
on e(x)
  -- return correspond à CHR(13)
  set wT to wT & return & x
end e

-- Suppression d'un fichier du répertoire /Users/temp
on EffaceFichier(xFic)
  -- Tous droits réservés, RCI Informatique SA, 2004
  tell application "Finder"
    tell folder "temp" of folder "Users" of startup disk
      try -- Le fichier peut ne pas exister
        delete file xFic
      end try
    end tell -- folder
  end tell -- finder
end EffaceFichier


-- Boucle d'attente de la présence du fichier "fin.lst"
on AttenteFinSqlPlus()
  -- Tous droits réservés, RCI Informatique SA, 2004
  tell application "Finder"
    tell folder "temp" of folder "Users" of startup disk
      repeat
        if exists file "fin.lst" then return
      end repeat
    end tell -- folder
  end tell -- finder
end AttenteFinSqlPlus


-- Obtention de tout le contenu d'un fichier
-- en utilisant les "additions standards" à AppleScript
on LireFichier(xFic)
  -- Tous droits réservés, RCI Informatique SA, 2004
  set wFic to open for access alias ("DisqueDur:Users:temp:" & xFic)
  set L to get eof wFic
  set w to read wFic from 1 for L
  close access wFic
  return w
end LireFichier

-- Pour quitter l'application Terminal
on QuitterTerminal()
  tell application "Terminal"
    quit
  end tell
end QuitterTerminal






Revenir au sommaire  AppleScript et Oracle






Tous droits réservés, RCI Informatique SA, 2004

rci@wanadoo.fr

www.rci-informatique.fr

www.index-informatique.net