Oracle Forms & Reports

Comment exécuter une commande du système d'exploitation depuis Oracle Reports (comme le builtin HOST d'Oracle Forms)

S'APPLIQUE À :

Oracle Reports Developer - versions 9.0.4.0 à 11.1.1.4.0 [Release Oracle9i à 11g]
Les informations de ce document s'appliquent à toutes les plateformes.

OBJECTIF

Dans Oracle Forms, le builtin HOST permet d'exécuter une commande donnée du système d'exploitation.

Cette note explique comment utiliser Java dans Oracle Reports pour obtenir le même résultat.

Mise en garde

Les exemples de programmes de cet article sont fournis à des fins éducatives seulement et ne sont PAS pris en charge par Oracle Support Services.
Ils ont toutefois été testés à l'interne et fonctionnent comme décrit.
Nous ne garantissons pas qu'ils fonctionneront chez vous : testez-les donc dans votre environnement avant de vous y fier.

SOLUTION

1. Importez la classe Java java.lang.Runtime :
a. Menu Program -> Import Java Classes ...
b. Saisissez 'java.lang.Runtime' dans le champ 'Import Classes:'
c. Cliquez sur <Import>

2. Utilisez la fonction exec (pour appeler cette fonction, il faut récupérer l'objet "runtime")
Exemple :

function BeforeReport return boolean is
  rt ORA_JAVA.JOBJECT;
  proc ORA_JAVA.JOBJECT;
begin
  rt := RUNTIME.GetRuntime();
  proc := RUNTIME.exec(rt,'cmd /c set > e:\temp\getruntime.txt');

  return (TRUE);
end;

Cet exemple renvoie les variables d'environnement d'un environnement Windows.

3. Pour attendre la fin de la "commande OS", importez la classe Java java.lang.Process et utilisez la méthode waitfor (c'est nécessaire si vous voulez lire le fichier généré par la commande OS) :

function BeforeReport return boolean is 
  rt ORA_JAVA.JOBJECT; 
  proc ORA_JAVA.JOBJECT; 
  l_rc NUMBER;
begin 
  rt := RUNTIME.GetRuntime(); 
  proc := RUNTIME.exec(rt,'cmd /c set > e:\temp\getruntime.txt'); 
  l_rc := PROCESS.waitfor (proc); 

  return (TRUE); 
end;

4. Voici ci-dessous un exemple pour les systèmes UNIX qui récupère les variables d'environnement :

 function BeforeReport return boolean is   
  rt ORA_JAVA.JOBJECT;   
  proc ORA_JAVA.JOBJECT;   
  cmdarray ORA_JAVA.JOBJECT;   
  l_temp_outfile VARCHAR2(2048);   
  l_rc NUMBER;   
BEGIN   
-- java.lang.Runtime and java.lang.Process must be imported.   

begin   
l_temp_outfile := SRW.CREATE_TEMPORARY_FILENAME;   

rt := RUNTIME.GetRuntime();   

-- Create a STRING ARRAY to pass to the method exec   

cmdarray := ORA_JAVA.NEW_STRING_ARRAY(3);   
ORA_JAVA.SET_STRING_ARRAY_ELEMENT (cmdarray, 0, '/bin/sh');   
ORA_JAVA.SET_STRING_ARRAY_ELEMENT (cmdarray, 1, '-c');   
ORA_JAVA.SET_STRING_ARRAY_ELEMENT (cmdarray, 2, 'env >' || l_temp_outfile || ' 2>&1');   

proc := RUNTIME.exec(rt,cmdarray);   

-- Wait for the process completion   
l_rc := PROCESS.waitfor (proc);   

exception   
when others then null;   
end;   

return(TRUE);   
end;